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中的一个缺陷,但现在我们无法做很多事情:(