15

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

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

char u = '\u+10FFFF';
4

4 回答 4

22

您不能使用单个char(包含 UTF-16 代码单元)来执行此操作,但您可以使用String

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

或者:

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

那是一个代理对(两个 UTF-16 代码单元,它们组合形成一个超出基本多语言平面的单个 Unicode 代码点)。当然,您也需要任何可以显示您的数据的东西来处理它......

于 2012-03-23T06:26:32.997 回答
8

除了 using StringBuilder,您还可以使用直接在Character类中找到的函数。该功能是 toChars(),它具有以下规格:

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

所以你不需要确切地知道代理对的样子,你可以直接使用代码点。示例代码如下所示:

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

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

于 2016-10-23T15:56:39.817 回答
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 值视为未定义字符。例如,Character.isLetter('\uD840') 返回 false,即使此特定值后跟字符串中的任何低代理值将表示一个字母。

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

在 J2SE API 文档中,Unicode 代码点用于 U+0000 到 U+10FFFF 范围内的字符值,Unicode 代码单元用于 UTF-16 编码的代码单元的 16 位字符值。

于 2012-03-23T06:47:19.177 回答
1

Unicode 字符可以占用两个以上的字节,这通常不能包含在一个字符中。

于 2012-03-23T06:27:46.830 回答