为什么"Ꙭ".codePointAt(0)== 205和其他Java Character奇异?

jwl*_*jwl 10 java unicode

(为了避免因为过于本地化而关闭,我选择Ꙭ作为示例,但这也适用于许多其他角色)

字符Ꙭ是\ 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
Run Code Online (Sandbox Code Playgroud)

除了#2之外的所有东西对我来说都没有意义.这个字符在BMP中,而不是从\ uD800到\ uDFFF,所以代理不应该有任何复杂性.看来我在这里错过了一些关键概念......

Tom*_*ine 6

看起来编辑器使用的字符编码与javac(或等效编译器)使用的编码不同.javac将默认选择在您的计算机上设置为默认值的编码.使用-encoding更改javac的.

Ꙭ在UTF-8中将以拉丁语1(或类似)出现为ê¬(0xEA 0x99 0xAD),这对于字符文字无效,因为它是三个字符.

至于3和4,它显然是在相对较新的Unicode 5.1.0(2008年3月)中引入的,可能是您使用的Java版本不支持.显然Java SE 6使用Unicode 4.0; Java SE 7使用Unicode 6.0.0.

大多数人都坚持使用US ASCII来获取源文件,这是有充分理由的.

  • 显然Java SE 6使用Unicode 4.0; Java SE 7使用Unicode 6.0.0. (2认同)