Тип данных 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.