Причина real в том, что indexOf(int)
ожидает кодовую точку Unicode, а не 16-битный UTF-16 "символ". Кодовые точки Unicode на самом деле имеют длину до 21 бита.
(Представление UTF-16 более длинной кодовой точки на самом деле представляет собой 2 16-разрядных «символьных» значения. Эти значения известны как начальные и конечные суррогаты; D800 16 до DBFF 16 и DC00 16 до DFFF 16 соответственно; см. Unicode FAQ - UTF-8, UTF-16, UTF-32 и BOM для подробностей. )
Если вы дадите indexOf(int)
кодовую точку> 65535, она будет искать пару символов UTF-16, которые кодируют кодовую точку.
Об этом говорится в javadoc (хотя и не очень четко), и изучение кода показывает, что этот метод действительно реализован.
Почему бы просто не использовать 16-битные символы?
Это довольно очевидно. Если бы они это сделали, не было бы простого способа найти кодовые точки больше 65535 в строках. Это было бы серьезной проблемой для людей, которые разрабатывают интернационализированные приложения, где текст может содержать такие кодовые точки. (Многие предположительно интернационализированные приложения ошибочно предполагают, что char
представляет собой кодовую точку. Часто это не имеет значения, но все чаще и чаще.)
Но это не должно иметь никакого значения для вас. Метод по-прежнему будет работать, если ваши строки состоят только из 16-битных кодов ... или, в этом отношении, только из кодов ASCII.