Почему "Ꙭ".codePointAt(0) == 205 и другая Java-характерная странность?

(Чтобы это не было закрыто как слишком локализованное, я выбрал Ꙭ в качестве примера, но это происходит и для многих других символов)

Символ Ꙭ равен \uA66C или десятичному числу 42604 (http://unicodinator.com/#A66C). Я вижу некоторые очень странные вещи, которые я не могу понять при использовании класса Java Character.

1) Character.isLetter('Ꙭ');//won't compile, complains 'unclosed character literal'
2) Character.isLetter("Ꙭ".charAt(0)); //returns true, which is right
3) Character.isLetter(42604);//returns false
4) Character.isLetter('\uA66C');//returns false
5) "Ꙭ".codePointAt(0);//returns 205? 205 is Í http://unicodinator.com/#00CD
6) ("Ꙭ".charAt(0)==(char)42604) //is false

Все, кроме # 2, не имеет для меня смысла. Этот символ находится в BMP и не от \uD800 до\uDFFF, поэтому не должно быть никакой сложности с суррогатами. Похоже, я пропустил здесь ключевую концепцию...

Ответ 1

Похоже, что символ, кодирующий ваш редактор, отличается от используемого javac (или эквивалентного компилятора). javac будет по умолчанию собирать любую кодировку, которая будет установлена ​​по умолчанию на вашем компьютере. Используйте -encoding для изменения для javac.

Ꙭ в UTF-8 будет отображаться на латинице 1 (или аналогичной) как ê¬ (0xEA 0x99 0xAD), что недопустимо для символьного литерала, так как это три символа.

Что касается 3 и 4, он, по-видимому, был введен в относительно новом Unicode 5.1.0 (март 2008 г.), который, предположительно, не поддерживается версией Java, которую вы используете. По-видимому, Java SE 6 использует Unicode 4.0; Java SE 7 использует Unicode 6.0.0.

Большинство людей придерживаются US ASCII для исходных файлов, не без оснований.