为什么Java不能正确显示字符串中的Unicode字符?

3

我正在使用IntelliJ IDEA,尝试输出一个包含滑雪者U+26F7和一个跑步者U+1F3C3的unicode字符串,下面是我的代码:

System.out.println("\u26f7" + "   " + "\u1f3c3");

只有滑雪者能正常显示。但是,IntelliJ会用不同的颜色显示最后3个运动员代码,表示存在问题。有什么解决方法吗?


2
您的第二个字符有5个数字,这在Java中是不可能的,但是这里有一个解决方法:https://dev59.com/GmIk5IYBdhLWcg3wIrBU 因此,在您的情况下,\uD83C\uDFC3应该可以解决这个问题。 - pdem
2个回答

0

Java使用utf16编码,因此字符\u1f3c3超出了其范围。您可以使用其代理对传递该字符。

System.out.println("\u26f7" + "   " + "\ud83c\udfc3")

问题涉及Java而不是Javascript。 - phuclv
它仍然没有显示它们:两者都只显示了一个小矩形。 - cellpowerhouse
@cellpowerhouse 如果是这样的话,你的控制台字符集不支持该特定字符。 - Mark Rotteveel

0

Java的转义语法是在Unicode预计不超过216个字符时设计的,因此您必须在\u后面指定确切的四个十六进制数字。不能多也不能少。

"\u1f3c3"实际上是两个字符\u1f3c3

Java字符串始终处于UTF-16编码中。因此,一种选项是查找有关您的字符的详细信息(例如这里),并在字符串中使用相应的UTF-16值:0xD83C 0xDFC3 → "\uD83C\uDFC3"

另一种选项是在java.util.Formatter中使用%c格式说明符。例如:

System.out.printf("%c   %c%n", 0x26f7, 0x1f3c3);

(与println不同,printf不会打印换行符,除非您在格式中添加%n。)


它也不起作用。可能是我的系统有问题(我正在使用Linux)。 - cellpowerhouse
你是否验证了U+1F3C3字符在任何字体中都可见?该fileformat.info页面应该在Java Data表的前两行显示该字符。或者,您可以尝试运行gedit并在编辑器中键入Ctrl-Shift-U 1f3c3 <space>。 - VGR
它只显示滑雪者,就像在IntelliJ IDEA中一样。我还尝试在vim中粘贴,结果也是一样的。我的系统无法显示0xffff之外的Unicode字符 :| - cellpowerhouse

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