Почему Java не может прочитать этот символ Юникода в файле UTF-8? - PullRequest
0 голосов
/ 01 июля 2018

Файл "unicode.txt" UTF-8

?アफਸᙡşüabÇİÜ⏩ア

Первый символ имеет 4 байта. И когда я запускаю этот код, я не могу получить ожидаемый вывод

InputStream in = new FileInputStream("unicode.txt");
InputStreamReader inReader = new InputStreamReader(in, "UTF-8");
char ch = (char)inReader.read();
System.out.println(ch); // Writes '?' character to the console. Why ?

Почему этот код не записывает символ '?' на консоль? И как мне это написать?

Моя кодировка по умолчанию:

System.out.println(System.getProperty("file.encoding")); // output: "UTF-8"
System.out.println(Charset.defaultCharset()); // output: "UTF-8"

Я думаю, проблема в типе данных char.

Спасибо.

1 Ответ

0 голосов
/ 01 июля 2018

Тип данных char основан на исходной спецификации Unicode, в которой символы определены как 16-битные объекты фиксированной ширины. С тех пор стандарт Unicode был изменен, чтобы разрешать символы, для представления которых требуется более 16 бит. Диапазон кодовых точек Unicode теперь составляет от U + 0000 до U + 10FFFF. Набор символов от U + 0000 до U + FFFF называется базовой многоязычной плоскостью (BMP), а символы, кодовые точки которых больше, чем U + FFFF, называются дополнительными символами. Следовательно, значение символа представляет кодовые точки BMP, включая суррогатные кодовые точки или кодовые единицы кодирования UTF-16. Значение int представляет все кодовые точки Unicode, включая дополнительные кодовые точки.

В частности, не пишите код, который предполагает, что значение типа примитива char (или объекта Character) полностью представляет кодовую точку Unicode.

(от https://wiki.sei.cmu.edu/confluence/plugins/servlet/mobile?contentId=88487813#content/view/88487813)

Другими словами, вы наткнулись на символ Юникода, который представлен более чем одной единицей кода BMP (т.е. char) в кодировке UTF-16 переменной длины, используемой Java.

...