如何在Java中编写Unicode十字符号?

27

我正在尝试在Java中写入这个Unicode十字符号():

class A {
    public static void main(String[] args) {
        System.out.println("\u2300");
        System.out.println("\u10035");
    }
}

我可以轻松地写出带有横线的o(),但是十字形符号没有显示出来,它只是打印数字5:

# javac A.java && java A
⌀
ဃ5

为什么?


1
你所询问的字符来自于线性B文字。这真的是你想要的吗?通常情况下,你会发现超出BMP范围的字符在通用字体中不太常见。 - parsifal
1
@parsifal:我试图为路边的公用事业电线杆制作Unicode艺术。 - Dog
1
这种事情让我想知道,我在自己的编程语言中是否正确理解了这个? $ txr -c '@(bind a "\x10035")' 输出:a=""。是的!当然;我不会随意截断指定字符的十六进制数字。 - Kaz
老兄,你是怎么想出这么史诗般的问题的? - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
4个回答

52

您正在寻找U+10035,它位于基本多语言平面之外。这意味着您不能使用\u来指定该值,因为它仅处理U+0000到U+FFFF——在\u之后始终有恰好四个十六进制数字。所以目前您得到的是U+1003 ("缅甸字母 GHA")后跟着'5'。

不幸的是Java不提供一种简单表达BMP之外字符的字符串字面形式。唯一的方法是将其包含在文字字面形式中(但仍在ASCII范围内),这就要使用UTF-16代理对形式:

String cross = "\ud800\udc35";

或者,您可以使用32位代码点形式作为int

String cross = new String(new int[] { 0x10035 }, 0, 1);

(这两个字符串相等。)

话虽如此,您的控制台仍需要支持该字符——您需要尝试一下才能确定它是否支持。


我明白了。你是怎么得到这个由2个Unicode转义序列组成的字符串的呢?在编写Unicode字符串字面量时,有没有一种快速的方法可以做到这一点? - Dog
1
@Dog:说实话,我写了一些C#代码 - 因为在C#中我可以使用\U00010035 :) 阅读我现在附加的“UTF-16代理对”链接,了解为什么这两个值被组合在一起 - 由你来决定是否能够在脑海中做出计算,但我知道我至少不能够可靠快速地计算 ;) - Jon Skeet
2
获取各种编码的一种方式是从FileFormat.info网站上获取:http://www.fileformat.info/info/unicode/char/10035/index.htm - parsifal
@parsifal:不错 - 我之前没看过。 - Jon Skeet
2
在Java中打印代码点的字面形式:for(char ch : Character.toChars(0x10035)) System.out.format("\\u%04x", (int) ch); - McDowell
不仅控制台必须支持它,而且控制台必须有一个支持它的字体,或者可以配置为使用这种字体。如果控制台显示类似方框的东西,请尝试将其复制并粘贴到您知道支持超出BMP的Unicode的其他应用程序中。值得安装一两个后备字体,以尽可能涵盖Unicode,这样即使可能很丑陋,您也可以看到一些字形。例如Code2000和Code2001字体。 - hippietrail

3

我相信Java可以表示从0x00000xFFFF的Unicode字符。Java会将"\u10035"转换成"\u1003"再加上一个5。


1

0

Unicode转义符长度为4个字符。你正在打印\u1003后面跟着'5'。你确定你有正确的代码点吗?


请查看Jon Skeet的答案,了解BMP之外的内容。 - Bobulous

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