为什么我不能在Java中使用\ u000D和\ u000A作为CR和LF?

sad*_*lam 43 java unicode

为什么我不能在Java中使用\ u000D和\ u000A作为CR和LF?编译代码时出错:

illegal line end in character literal
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 111

在运行编译器之前预先处理Unicode转义.因此,如果你\u000A输入这样的字符串文字:

String someString = "foo\u000Abar";
Run Code Online (Sandbox Code Playgroud)

它的编译方式与您编写的完全相同:

String someString = "foo
bar";
Run Code Online (Sandbox Code Playgroud)

坚持\r(回车; 0x0D)和\n(换行; 0x0A)

额外奖励: 你总能玩得很开心,特别是考虑到大多数语法荧光笔的限制.下次有一秒时,请尝试运行此代码:

public class FalseIsTrue {
    public static void main(String[] args) {
        if ( false == true ) { //these characters are magic: \u000a\u007d\u007b
            System.out.println("false is true!");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @stacktracer :--).如果这是一个严肃的问题,我想答案是没有任何东西强迫预处理器将该字符解释为擦除前一个字符的命令.Eclipse的控制台也忽略了它.就像放一个\ u000d实际上不会导致计算机的回车! (4认同)
  • 这是C#更优雅地解决的问题,允许那些转义只用于字符串,字符和标识符.这样,如果你不能输入非ASCII标识符,你仍然可以使用非ASCII标识符,但是你不会有机会以这种方式修改源代码.无论如何,必须在编译器中完成预处理.Java人员显然没有从C语言中学习三字母,它们具有类似的代码破解属性. (3认同)
  • 听起来像是 Mono 中的一个错误,它不符合规范。Microsoft 自己的 C# 编译器 (4.0.30319.17929) 拒绝该代码,带有 `blah.cs(5,19): error CS1056: Unexpected character '\u002F'`(几次)和 `blah.cs(5,19): error CS1519:类、结构或接口成员声明中的无效标记“\u002F”。虽然我猜想并没有太多的 C# 代码试图(ab)使用它。 (2认同)