如何显示扩展的unicode> 0xFFFF的?

时间:2014-10-26 12:46:24

标签: java unicode

某些字体,即Symbola和Segoe ui符号,其字符具有五位十六进制分配。即字符“蘑菇”是Ox1F344

他们在excel等字符选择器中显示得很好但是这段代码。

gr.setFont(new Font("Segoe UI Symbol",Font.PLAIN,12);

gr.drawString(""+(char)Ox1F344+(char)Ox270B,100,100);

给我一​​个不知名的角色和一只手,而不是蘑菇和手。

我做错了什么?

2 个答案:

答案 0 :(得分:2)

(char)Ox1F344会溢出,因为char is a 16-bit type0x1F344需要超过16位。

在Java中,characters are UTF-16 code units,而不是实际的Unicode字符。所以你需要UTF-16版本的角色,0xD83C 0xDF44。然后你需要把它放在字符串中:

gr.drawString("\uD83C\uDF44\u270B", 100, 100);
// This -------------------^^^^^^ is unrelated, it's the
// second character shown in your question.

答案 1 :(得分:1)

""+(char)Ox1F344+(char)Ox270B
遗憾的是,Java的char / String类型基于UTF-16代码单元,因此0x1F344溢出了16位char数据类型,并且与0xF344(私有使用区域中的非标准化代码点,可能显示为任何内容)。

在UTF-16中编码基本多语言平面(0-0xFFFF)之外的字符时,必须使用两个代理(0xD800-0xDFFF)字符。因此\u - 的转义形式为"\uD83C\uDF44"

从1.5开始,有一些新方法可以尝试向您隐藏并处理实际代码点,例如int[]构造函数:

int[] codePoints = {0x1F344, 0x270B};
new String(codePoints, 0, codePoints.length) // == "" == "\uD83C\uDF44\u270B"