Java Unicode转换
我遇到以下代码:
public class LinePrinter {
public static void main(String args[]) {
//Note: u000A is unicode for Line Feed
char c=0x000A;
System.out.println(c);
}
}
由于完成了Unicode替换,所以不能编译。
问题是,为什么comment( //
)不会覆盖编译器完成的Unicode替换? 我认为编译器应该在做任何其他代码转换之前先忽略注释。
编辑:
不知道以上是否足够清楚。
我知道上述情况会发生什么,以及它为什么会出错。 我的期望是编译器在对代码进行任何翻译之前应该忽略所有注释行。 显然这不是这种情况。 我期待这种行为的理由。
该规范指出,Java编译器必须在做任何其他事情之前将Unicode转义符转换为其相应的字符,以允许在代码被存储或通过通道发送时,标识符中的非ASCII字符受到保护(通过native2ascii
)不是8位清洁。
这个规则适用于全局,特别是你甚至可以使用Unicode转义转义注释标记。 例如,以下两个片段是相同的:
// Deal with opening and closing comment characters /*, etc.
myRisquéParser.handle("/*", "*/");
u002Fu002F Deal with opening and closing comment characters /*, etc.
myRisquu00E9Parser.handle("/*", "*/");
如果编译器在处理Unicode转义之前尝试删除注释,它最终会剥离/*, etc.
到handle("/*", "*/
,离开
u002Fu002F Deal with opening and closing comment characters ");
然后将其转义为单行注释,然后在下一个解析阶段移除。 因此不会产生编译器错误或警告,但会默默删除整行代码......
它在Java Puzzlers#14中 - 解释的摘录:
理解这个难题的关键在于Java对字符串文字中的Unicode转义没有提供特殊的处理。 编译器在将程序解析为标记之前将其转换为它们表示的字符,例如字符串文字[JLS 3.2]。
JLS第7版中的相关部分是第3.3段:
Java编程语言(“Java编译器”)的编译器首先识别其输入中的Unicode转义,将ASCII字符 u后跟四个十六进制数字转换为指定的十六进制值的UTF-16代码单元(第3.1节),以及所有其他字符不变。
JLS第3部分的介绍给出了一个暗示,为什么会出现这种情况:
程序是用Unicode(§3.1)编写的,但是提供了词法转换(§3.2),所以Unicode转义(§3.3)可以用来包含任何只使用ASCII字符的Unicode字符。
链接地址: http://www.djcxy.com/p/20577.html下一篇: Why do some character literals cause Syntax Errors in Java?