char中的Unicode比U +中的U + FFFF多吗?

时间:2012-03-23 06:23:23

标签: java unicode utf-8 astral-plane

如何在Java中使用char显示U + FFFF上方的Unicode字符?

我需要这样的东西(如果它有效):

char u = '\u+10FFFF';

4 个答案:

答案 0 :(得分:20)

您无法使用单个char(包含UTF-16代码单元),但您可以使用String

// This represents U+10FFFF
String x = "\udbff\udfff";

可替换地:

String y = new StringBuilder().appendCodePoint(0x10ffff).toString();

这是一个surrogate pair(两个UTF-16代码单元组合在一起构成基本多语言平面之外的单个Unicode代码点)。当然,您需要显示数据的任何内容来应对它......

答案 1 :(得分:4)

您也可以使用函数,而不是使用StringBuilder 直接在类Character中找到。功能是 toChars(),它有以下规范:

  

将指定的字符(Unicode代码点)转换为
  其UTF-16表示存储在{@code char}数组中。

因此,您无需确切了解代理对的外观 喜欢并直接使用代码点。一个示例代码 然后看起来如下:

int x = 0x10FFFF;
String y = new String(Character.toChars(ch));

请注意,代码点的数据类型是int而不是char。

答案 2 :(得分:2)

Source

  

char数据类型基于原始Unicode规范,该规范将字符定义为固定宽度的16位实体。合法代码点的范围现在是U + 0000到U + 10FFFF,称为Unicode标量值。

     

从U + 0000到U + FFFF的字符集有时被称为基本多语言平面(BMP)。代码点大于U + FFFF的字符称为增补字符。 Java 2平台在char数组和String和StringBuffer类中使用UTF-16表示。在此表示中,补充字符表示为一对char值,第一个来自高代理范围(\ uD800- \ uDBFF),第二个来自低代理范围(\ uDC00- \ uDFFF)。

     

因此,char值表示基本多语言平面(BMP)代码点,包括代理代码点或UTF-16编码的代码单元。 int值表示所有Unicode代码点,包括补充代码点。 int的较低(最低有效)21位用于表示Unicode代码点,而较高(最高有效)11位必须为零。除非另有说明,否则关于补充字符和代理字符值的行为如下:

     
      
  • 仅接受char值的方法不支持增补字符。它们将代理范围中的char值视为未定义的字符。例如,Character.isLetter('\ uD840')返回false,即使后面跟着字符串中任何低代理值的特定值也代表一个字母。

  •   
  • 接受int值的方法支持所有Unicode字符,包括补充字符。例如,Character.isLetter(0x2F81A)返回true,因为代码点值表示一个字母(CJK表意文字)。

  •   
     

在J2SE API文档中,Unicode代码点用于U + 0000和U + 10FFFF之间的字符值,Unicode代码单元用于16位字符值,这些值是UTF-16的代码单元编码

答案 3 :(得分:1)

Unicode字符可能需要两个以上的字节,而这些字节通常不能保存在字符中。