195 - это 0xC3 в гексе.
В UTF-8 Ü
кодируется как байты 0xC3 0x9C
.
System.getProperty("file.encoding")
говорит, что кодировкой файлов по умолчанию в Windows является не UTF-8, но ясно, что ваш Java-файл фактически кодируется в UTF-8. Тот факт, что println()
выводит glyph ??
(примечание 2 ?
, что означает наличие 2 char
s), и что вы можете декодировать необработанные строковые байты, используя UTF-8 Charset
, доказывает это .
glyph
должен иметь один char
со значением 0x00DC
, а не 2 char
с со значениями 0x00C3 0x009C
. getCodepointAt(0)
возвращает 0x00C3
(195) в Windows, потому что ваш Java-файл закодирован в UTF-8, но загружается так, как если бы он был закодирован в Windows-1252, поэтому 2 байта 0xC3 0x9C
декодируются как символы 0x00C3 0x009C
вместо символа 0x00DC
.
Вам необходимо указать фактическую кодировку файла при запуске Java, например:
java -Dfile.encoding=UTF-8 ...