Character可以代表所有unicode代码点吗?

时间:2012-01-07 08:19:39

标签: java unicode utf-16

由于Java char是16位长,我想知道它如何代表完整的unicode代码点? 它只能代表65536个代码点,是吗?

2 个答案:

答案 0 :(得分:8)

是的,Java char是UTF-16代码单元。如果需要在Basic Multilingual Plane之外表示Unicode字符,则需要在java.lang.String内使用代理项对。 String类提供了各种方法来处理完整的Unicode代码点,例如codePointAt(index)

来自section 3.1 of the Java Language Specification

  

Unicode标准最初设计为固定宽度的16位字符编码。它已被更改为允许其表示需要超过16位的字符。合法代码点的范围现在是U + 0000到U + 10FFFF,使用十六进制U + n表示法。代码点大于U + FFFF的字符称为增补字符。为了仅使用16位单元表示完整的字符范围,Unicode标准定义了一种名为UTF-16的编码。在此编码中,补充字符表示为16位代码单元对,第一个来自高代理范围(U + D800到U + DBFF),第二个来自低代理范围(U + DC00到U) + DFFF)。对于U + 0000到U + FFFF范围内的字符,代码点和UTF-16代码单元的值是相同的。

     

Java编程语言使用UTF-16编码表示16位代码单元序列中的文本。一些API(主要在Character类中)使用32位整数将代码点表示为单个实体。 Java平台提供了在两种表示之间进行转换的方法。

有关详细信息,请参阅Character docs

答案 1 :(得分:2)

一个char,无符号16位,可以表示任何高达0xFFFF的代码点,但不能代表更大的补充字符。 Java最好被认为是在char中使用UTF-16编码,因此,补充字符实际上表示为char对,一个代理对。虽然一个char不能代表这样的补充字符,但Java确实可以处理它。