转义序列八进制表示法未按预期工作


class A {
    public static void main(String args[]) {
        char c= '777';
        System.out.println(c);
    }
}

这给出了编译错误(在Java 8编译器上运行(。

转义序列的八进制表示法的格式为"\xxx",但在上述情况下它不起作用,字符 c='\077' 正在工作。

这是什么原因呢?

JLS 第 3.10.6 节 "字符和字符串文字的转义序列"指出,八进制char文字最多可以是 3 个八进制数字,如果有 3 个,则第一个限制为 0-3。

OctalEscape:
 OctalDigit 
 OctalDigit OctalDigit 
 ZeroToThree OctalDigit OctalDigit 
OctalDigit:
(one of) 
0 1 2 3 4 5 6 7
ZeroToThree:
(one of) 
0 1 2 3

最大377是十进制的 255,因此看起来这样做是为了使该值适合一个(无符号(字节。

因为八进制转义序列只能指定 1 字节字符值,而八进制777是十进制511,即超出 1 字节值的范围。

作为 Java 语言规范 3.10.6。字符和字符串文字的转义序列是这样说的:

八进制转义是为了与 C 兼容而提供的,但只能表示 Unicode 值u0000u00FF,所以 Unicode 转义通常是首选

八进制转义的完整规范是:

OctalEscape:
   OctalDigit
   OctalDigit OctalDigit
   ZeroToThree OctalDigit OctalDigit
OctalDigit:
  (one of)
  0 1 2 3 4 5 6 7
ZeroToThree:
  (one of)
  0 1 2 3

如您所见,允许的最大八进制数为 377 .

进制字符可以从0377(即十六进制:0x000xFF(。

为了超越这一点,您将需要使用表示基于 Unicode 的十六进制的 uXXXX 表示法。

关于Character的 Java 文档非常冗长,并且提供了有关此主题的大量信息。

对于您的特定示例,我认为您想执行以下操作:

public  class A {
    public static void main(String args[]) {
        char c= 'u0777';
        System.out.println(c);
    }
}

最新更新