Java中如何将超过U+FFFF的字符转换为Unicode?

17

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

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

char u = '\u+10FFFF';

1
请查看此文档。虽然您无法将超过0xFFFF的内容物理放入char中。 - mpontillo
4个回答

24
你无法使用单个char(它只能容纳UTF-16编码单元)来实现,但你可以使用String
// This represents U+10FFFF
String x = "\udbff\udfff";

或者:

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

那是一个代理对(由两个UTF-16代码单元组合而成,形成单个Unicode代码点超出了基本多语言平面)。当然,您需要使用能够处理它的内容来显示数据...


8

除了使用 StringBuilder,您还可以直接使用 Character 类中的函数。该函数是 toChars(),其规范如下:

将指定的字符(Unicode 代码点)转换为
其 UTF-16 表示形式存储在一个 char 数组中。

因此,您不需要确切地知道代理对看起来像什么,您可以直接使用代码点。然后,示例代码如下:

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

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


1

Unicode字符可能需要超过两个字节,这在char类型中无法通用地容纳。


3
注意,在Java中,一个char占用2个字节 - mpontillo

1

源代码

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值的方法无法支持补充字符。它们将代理范围中的char值视为未定义字符。例如,Character.isLetter('\uD840')返回false,即使这个特定值后跟任何低代理值在字符串中表示一个字母。
- 接受int值的方法支持所有Unicode字符,包括补充字符。例如,Character.isLetter(0x2F81A)返回true,因为代码点值表示一个字母(CJK表意文字)。
在J2SE API文档中,Unicode代码点用于U+0000和U+10FFFF之间的字符值,Unicode代码单元用于16位char值,它们是UTF-16编码的代码单元。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接