为什么在Java中我不能创建一个与Unicode城堡字符绑定的char?

15
class A {
    public static void main(String[] args) {
        char a = '∀';
        System.out.println(a);
        char castle = '';
        System.out.println(castle);
    }
}

我可以很好地制作倒置的A字符,但是当我尝试制作城堡字符时,它会出现3个编译错误。为什么?

$ javac A.java && java A
A.java:5: unclosed character literal
        char castle = '';
                      ^
A.java:5: illegal character: \57159
        char castle = '';
                        ^
A.java:5: unclosed character literal
        char castle = '';
                         ^
3 errors

2
每个字符下面的^是什么?你加上的吗? - 0x6C38
3
@MrD 那是javac指出错误所在的地方。 - Boann
2
fileformat.info告诉你如何输入: "\uD83C\uDFF0" - millimoose
3
为什么有人给我的评论点赞,它很愚蠢。 - 0x6C38
创建一个只包含该字符的字符串,然后打印出字符串的长度。 - Hot Licks
2
@millimoose:……除了OP帖子中的字符实际上是U+1D347,或者使用UTF-16代理项"\uD834\uDF47" - Ilmari Karonen
3个回答

15
我猜测这个城堡字符不适合单个char,而需要一个int代码点。在这种情况下,您可以在String字面值中使用它,但不能作为char使用。 Character的Javadoc说明如下: “char”数据类型(因此是Character对象封装的值)基于最初的Unicode规范,该规范将字符定义为固定宽度的16位实体。 Unicode标准已更改,以允许表示需要超过16位的字符。合法代码点的范围现在为U+0000至U+10FFFF,称为Unicode标量值。
所以我猜想那个字符需要超过16位,因此需要将其处理为int代码点。

他的代码点是0x1d347。Java不允许您放置任何代码点超过0xffff的字符,这可能是因为Java字符不是Unicode代码点,而是UTF-16字。 - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

2

如果您的源代码文件包含非ASCII字符(如此文件),您需要确保javac以正确的编码读取它,否则它将默认使用可能不是保存文件的编码。

因此,如果您在编辑器中使用UTF-8保存文件,则可以使用以下命令进行编译:

javac -encoding utf8 A.java

请注意,您也可以使用Unicode代码点来代替实际字符,这样可以使代码在没有-encoding指令的情况下编译通过。
char a = '\u2200';              // The codepoint for the ∀ character
String castle = "\ud834\udf47"; // Being a high-surrogate char, the castle cannot fit a single 16 bit char

城堡不是高代理字符。高代理字符(现在称为前导代理字符)的值位于D800–DBFF范围内。 \uD834是高代理字符。城堡只是一个非BMP字符。 - R. Martinho Fernandes
你说得对,这个注释措辞不当。城堡在补充平面中,必须用代理对(2个16位字符)来表示,而不是单个字符。 - EmirCalabuch

-1

如果您正在使用Windows:

  • 在任何地方创建一个新的空白文本文件,并将复制粘贴到文本文件中。
  • 关闭它,右键单击 >> 属性 >> 在常规选项卡中查看大小,它是2字节。

正如您所看到的,它是2个字节,因此您需要使用两个字符。
您可能想阅读有关UTF-16的内容。


Java在内部使用UTF-16。所有的Java字符都是两个字节长,而不是一个。这不是C语言的问题。问题不是它是两个字节,而是它超过了两个字节,并且Java无法处理由代理对表示的字符。 - Keith Irwin

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