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

时间:2013-03-24 21:34:06

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

1 个答案:

答案 0 :(得分:6)

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

UTF-8中的

will将出现在拉丁语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来获取源文件,这是有充分理由的。