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

上一篇: Java Unicode translation

下一篇: Why do some character literals cause Syntax Errors in Java?