解析 Java 6 字符串文字中的 unicode 转义时出现问题……?
题
为什么在 java 6 (Sun 1.6.0_16) 中编译:
System.out.println("\u000B");
...但不是这个:
System.out.println("\u000A");
在这个程序上:
public class Test {
public static void main(String argv[]) {
System.out.println("\u000A");
}
}
我得到一个
Test.java:3: unclosed string literal
System.out.println("\u000A");
这里发生了什么?
解决方案
的问题是,Unicode替换在编译非常早期完成。 Unicode转义字符不只是在字符串和字符(如如\t
其他转义序列)有效的 - 他们是有效的的任何地方的代码。 部分 - 它们在规范的不同区域正在描述3.3 而非部分3.10.6 ;只有后者是约字符和字符串文字转义序列。
基本上,该规范对于词法结构的详细信息的读出部分3:)
所以,你的代码是确实的等价于:
public class Test {
public static void main(String argv[]) {
System.out.println("
");
}
}
...这显然不是有效的代码。为回车和换行,基本上也最好使用“\ r”和“\ n”个转义序列。
我个人认为这处理的Unicode转义为Java中的漏洞,但不是很多,我们现在可以做些什么:(
其他提示
Unicode 转义在词法分析之前被扩展。Unicode 转义出现在字符串文字中这一事实是无关紧要的。参见 JLS 3.2。
这是因为\ u000a = \ n和编译过程中,为了将其转换为记号,所以在你的代码中不能使用Unicode字符的Java源代码。同样为\ u000d = \ r
如果我没有记错的话,避免prepocessing我们可以通过改变线路在解决这个问题:
System.out.println((char)10);
的限制是通过作为CHAR
,它的扩展将是从0到255。
不隶属于 StackOverflow