非BMP平面字符的Unicode转义序列

4
在Java中,Unicode字符可以使用UTF-16编码的Unicode转义序列来表示。以下是一个表示BMP平面字符的示例。
char ch = '\u00A5'; // '¥'

代理对是否可用于非BMP平面字符?

char ch4 = '\uD800\uDC00'; //Invalid character constant

如何使用Java语法表示非BMP平面字符?


请记住,Java中的char不能保存Unicode代码点。需要使用Java int来保存。这是因为Unicode代码点可以高达0x10FFFF,但Java char只能保存最大值为0xFFFF的值。Java中的char并不是一个字符。 - tchrist
@tchrist 不是一个字符? - overexchange
2个回答

9

你不能使用单个字符常量来实现这个功能,因为一个char是一个UTF-16编码单元。你需要使用一个字符串常量,例如:

final String s = "\uXXXX\uYYYY";

其中XXXX是高代理项,YYYY是低代理项。

另一种解决方案是使用一个int来存储代码点; 然后可以使用Character.toChars()将其转换为char[]

final int codePoint = 0x1f4ae; // for instance
final char[] toChars = Charater.toChars(codePoint);

根据您使用的工具,您也可以直接添加代码点(例如,StringBuilder有一个相应的方法)。


我在 char ch4 = '\uD800\uDC00'; 处遇到语法错误,错误信息为:无效的字符常量 - overexchange
3
当然,你需要再次阅读我的回答:对于那个,你不能使用字符常量,你需要一个字符串常量。 - fge
代码示例中有一个错别字:“Charater”而不是“Character”。它不能通过编辑进行更正,因为编辑必须至少为六个字符 :-( - stm

0
为了避免为非BMP字符编写代理对并从代码点获取字符串,有几种方法。
String test1 = new String(new int[] { 0x1f4ae }, 0, 1);
String test2 = String.valueOf(Character.toChars(0x1f4ae));
String test3 = Character.toString(0x1f4ae):

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