解析Java 6字符串文字中的unicode转义问题...?
问题描述:
为什么这个编译Java 6中(孙1.6.0_16):解析Java 6字符串文字中的unicode转义问题...?
System.out.println("\u000B");
...但不是这样的:
System.out.println("\u000A");
在此程序:
public class Test {
public static void main(String argv[]) {
System.out.println("\u000A");
}
}
我得到a
Test.java:3: unclosed string literal
System.out.println("\u000A");
这里发生了什么?
答
问题在于编译时很早就完成了Unicode替换。 Unicode转义不仅在字符串和字符文字中有效(如其他转义序列,例如\t
) - 它们在代码中的任何地方都是有效的。他们被描述在规范的不同区域 - section 3.3而不是section 3.10.6;只有后者是大约字符和字符串文字转义序列。
基本上,读取该规范第3条对词法结构:)更多细节
所以,你的代码是实际上等同于:
public class Test {
public static void main(String argv[]) {
System.out.println("
");
}
}
...这显然是无效的码。对于回车和换行,基本上最好使用“\ r”和“\ n”转义序列。
我个人认为这处理的Unicode转义为Java中的漏洞,但不是很多,我们可以做些什么,现在:(
答
这是因为\ u000a = \ n并且编译器会处理java源代码以将其转换为令牌,因此您不能在代码中使用该Unicode字符。同为\ u000d = \ r
答
如果我没有记错的话,避免prepocessing我们可以通过改变线路中解决它:
System.out.println((char)10);
的限制是通过作为一个CHAR
,它的扩展将从0到255.
有人可以根据Jon Skeet的回答提出像可汗学院一样的视频教程。尊重。 – 2010-10-25 08:38:21
非常感谢! – daf 2010-10-25 18:40:44