某些字体,即Symbola和Segoe ui符号,其字符具有五位十六进制分配。即字符“蘑菇”是Ox1F344
。
他们在excel等字符选择器中显示得很好但是这段代码。
gr.setFont(new Font("Segoe UI Symbol",Font.PLAIN,12);
gr.drawString(""+(char)Ox1F344+(char)Ox270B,100,100);
给我一个不知名的角色和一只手,而不是蘑菇和手。
我做错了什么?
答案 0 :(得分:2)
(char)Ox1F344
会溢出,因为char
is a 16-bit type和0x1F344
需要超过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"