Kódování znaků v Javě

Kódování znaků a národní prostředí

Locale

národní prostředí, zahrnuje abecedu, kódování, zápis času/data, měny a národní jazyk

Charset

množina dostupných znaků, které program (typicky v řetězcích) může využít

Encoding

kódování znaků na vnějších zařízeních

Volba kódování

  • U mnoha (většiny) I/O operací a proudů lze při vytvoření navolit, které kódování se předpokládá nebo chce.

  • Nebo ponechat kódování výchozí (system-default) převzaté ze systému, kde aplikace (JVM) běží.

Implicitní kódování

  • V některých případech je výchozí kódování nastaveno napevno bez ohledu na systémová nastavení.

  • Některé metody JDK neumožňují zadání znakové sady a vždy předpokládají "výchozí" znakovou sadu UTF-8 pouze pro danou metodu a bez ohledu na lokalizaci nebo konfiguraci systému.

  • Většina moderních systémů má UTF-8 stejně jako výchozí.

  • Např. metody utilitní třídy Files vytvořené kvůli jednoduchosti použití:

    • Files.newBufferedReader(Path),

    • Files.newBufferedWriter(Path, OpenOption…​),

    • Files.readAllLines(Path),

    • Files.write(Path, Iterable, OpenOption…​) či

    • Files.lines(Path).

Řešení: implicitně UTF-8

  • Od Javy 18 je UTF-8 výchozí znakovou sadu standardních rozhraní API Javy:

    Díky této změně se budou rozhraní API závislá na výchozí znakové sadě chovat konzistentně ve všech implementacích, operačních systémech, místních jazycích a konfiguracích.
    -- https://openjdk.org/jeps/400

Zjištění kódování [1/2]

out.println("Default Locale:   " + Locale.getDefault());
out.println("Default Charset:  " + Charset.defaultCharset());
out.println("file.encoding;    " + System.getProperty("file.encoding"));
out.println("sun.jnu.encoding: " + System.getProperty("sun.jnu.encoding"));
out.println("Default Encoding: " + getEncoding());
Výše uvedený kód bude fungovat, deklarujeme-li na začátku import objektu out: import static java.lang.System.out;

Zjištění kódování [2/2]

Vypíše se:

Default Locale:   cs_CZ
Default Charset:  UTF-8
file.encoding;    UTF-8
sun.jnu.encoding: UTF-8
Default Encoding: UTF8