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. 1 -- 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 2