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
4

3 回答 3

15

我怀疑城堡字符不适合单个char,而是需要一个int代码点。在这种情况下,您可以在String文字中使用它,但不能作为char.

状态的 Javadoc Character

char 数据类型(以及因此 Character 对象封装的值)基于原始 Unicode 规范,该规范将字符定义为固定宽度的 16 位实体。此后,Unicode 标准已更改为允许表示需要超过 16 位的字符。合法代码点的范围现在是 U+0000 到 U+10FFFF,称为 Unicode 标量值。

所以我的猜测是该字符需要超过 16 位,因此需要将其视为int代码点。

于 2013-05-24T21:24:27.280 回答
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
于 2013-05-24T21:50:09.277 回答
-1

如果您使用的是 Windows:

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

如您所见,它是 2 字节,您需要使用两个字符。
您可能想了解 UTF-16

于 2013-05-24T21:50:35.630 回答