Java Unicode翻译

Java Unicode翻译,java,unicode,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替换已完成,因此无法编译 问题是,为什么注释(/)不覆盖编译器完成的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替换已完成,因此无法编译

问题是,为什么注释(
/
)不覆盖编译器完成的Unicode替换?我认为编译器应该先忽略注释,然后再进行代码翻译

编辑:

不确定上述内容是否足够清楚

我知道上面发生了什么,为什么会出错。我的期望是编译器在对代码进行任何翻译之前应该忽略所有注释行。显然,这里的情况并非如此。我期待着这种行为的基本原理。

这是Java拼图游戏14中的解释摘要:

理解这个难题的关键是Java没有对Unicode进行特殊处理 在字符串文本中转义。编译器将Unicode转义码转换为它们表示的字符,然后再将程序解析为标记,例如字符串文字[JLS 3.2]

JLS v7中的相关参数为:

Java编程语言的编译器(“Java编译器”)首先识别其输入中的Unicode转义,将ASCII字符\u后跟四个十六进制数字转换为所示十六进制值的UTF-16代码单元(§3.1),并传递所有其他字符不变

JLS第3节的介绍给出了一个提示,说明了为什么会出现这种情况:

程序是用Unicode(§3.1)编写的,但提供了词汇翻译(§3.2),因此Unicode转义符(§3.3)可用于包含任何仅使用ASCII字符的Unicode字符


该规范规定,Java编译器必须在执行任何其他操作之前将Unicode转义码转换为相应的字符,以便在通过非8位干净通道存储或发送代码时(通过
native2ascii
)保护标识符中的非ASCII字符

此规则适用于全局,尤其是您甚至可以使用Unicode转义来转义注释标记。例如,以下两个代码段是相同的:

// Deal with opening and closing comment characters /*, etc.
myRisquéParser.handle("/*", "*/");

\u002F\u002F Deal with opening and closing comment characters /*, etc.
myRisqu\u00E9Parser.handle("/*", "*/");
如果编译器在处理Unicode转义之前尝试删除注释,那么它最终将从
/*,等等
句柄(“/*”,“*/
)剥离所有内容,留下

\u002F\u002F Deal with opening and closing comment characters ");

这将被取消替换为一行注释,然后在下一个分析阶段删除。这样就不会产生编译器错误或警告,而是默默地删除整行代码…

这解释了为什么编译器会给出错误。但我的问题是:为什么编译器在代码中省略注释之前要分析unicode。@用户1885220因为它是语言规范的一部分。如果你的问题是“为什么语言是这样规定的?”?",我不知道。@user1885220 Unicode转义必须先处理,才能允许像
native2ascii
-ing在标识符中使用非ASCII字符的代码:
inté=5;
->
int\u00e9=5;
@user1885220 re。您的更新:该行为的基本原理是您的编译器符合关于语言规范!@assylias,可以这样说每个编译器错误:“您的代码不符合语言规范”.我想Ian Roberts回答了我的问题。+1,我想你已经弄明白了为什么会这样。另一个答案只是说明了我在问题/评论中已经发布的语言规范。你的例子非常准确!C#很好地解决了这个问题,注释中的Unicode转义仍然被忽略。如果你能写``那么就没有必要转义了,只是简单而已因为许多编译器无法处理Unicode字符,因为它已经在ASCII范围内。这将防止许多像这样或这样的意外情况,或者可能的重复