解析Java 6字符串文字中的unicode转义问题...?

Daf*_*ees 10 java unicode java-6

为什么要在java 6(Sun 1.6.0_16)中编译:

System.out.println("\u000B");
Run Code Online (Sandbox Code Playgroud)

......但不是这个:

System.out.println("\u000A");
Run Code Online (Sandbox Code Playgroud)

在这个计划上:

public class Test {
  public static void main(String argv[]) {
  System.out.println("\u000A");
  }
}
Run Code Online (Sandbox Code Playgroud)

我得到了

Test.java:3: unclosed string literal
System.out.println("\u000A");
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

Jon*_*eet 18

问题是Unicode替换是在编译的早期完成的.Unicode转义不仅在字符串和字符文字中有效(如同其他转义序列\t) - 它们在代码中的任何位置都有效.它们在规范3.3的不同区域而不是3.10.6节中描述 ; 只有后者是关于字符和字符串文字的转义序列.

基本上,阅读规范的第3部分有关词法结构的更多细节:)

所以你的代码实际上相当于:

public class Test {
  public static void main(String argv[]) {
  System.out.println("
");
  }
}
Run Code Online (Sandbox Code Playgroud)

......这显然不是有效的代码.对于回车和换行,基本上最好使用"\ r"和"\n"转义序列.

我个人认为这种处理Unicode转义是Java中的一个缺陷,但现在我们无法做很多事情:(

  • 有人可以根据Jon Skeet的答案提出像Khan Academy这样的视频教程序列.尊重. (2认同)