Java注释中如何读取Unicode字符

4
class Why
{
    public static void main(String[]s)
    {
        String st2="A";
        System.out.println(st2);
        // String st4="MN3444\u000ar4t4";
        System.out.println(st4);

    }
}

请编译上述代码,我在注释行收到了错误提示。 我无法理解编译器的行为,这个错误是什么意思?

1
编译器说了什么? - Abimaran Kugathasan
哇!这看起来像是JDK问题。 - Martijn Courteaux
有人在Facebook小组上开始了这个话题,并解释了与UNICODE字符相关的内容,但他们无法解释为什么编译器会读取注释中的内容。 另外,如果您将其替换为多行注释(/* */),则编译器不会读取它。@kugathasan:兄弟,只需编译此代码,您就会知道。 - Gagan93
2个回答

5

在编译之前,每个Unicode字符都会被其值替代,因为\u000a表示换行代码

// String st4="MN3444\u000ar4t4";

与此代码相同(请注意,在\u000a之后的文本将移到新行,这意味着它将不再是注释的一部分)

// String st4="MN3444
r4t4";

您可以使用以下方式进行测试:

//\u000a;System.out.println("hello comment");

等同于

//
System.out.println("hello comment");

执行该程序将以以下结果输出:hello comment


我同意Unicode的概念,但编译器为什么会从注释中读取代码呢? - Gagan93
1
@Gagan93 你看,问题是在将\u000a翻译为其值之后,你的代码在\u000a之后将不再是评论,而是单独的一行。 - Pshemo
@Gagan93 请看我建议的可能是重复问题的那个帖子(终于找到了)。那里应该会有一些很好的答案,可以帮助您更好地理解这个主题。 - Pshemo

3

如果我们查看 \u000a 的 ASCII 表,我们会发现这是一个换行符。因此我认为编译器会用相应的值替换注释中的 ASCII 转义字符。由于这是一个换行符,代码看起来像这样:

// String st4="MN3444
r4t4";

这就是编译器说:“字符串字面量没有正确用双引号关闭”的原因。
所以,这也解释了为什么多行注释可以工作:
/* String st4="MN3444\u000ar4t4"; */
被解析为:
   /* String st4="MN3444
r4t4"; */

这是一条很好的评论。


行为已经被定义:JLS §3.2. 词法转换

使用以下三个词法转换步骤,将原始Unicode字符流转换为标记序列:

在Unicode字符流中翻译Unicode转义(§3.3)到相应的Unicode字符。 形如\uxxxx的Unicode转义,其中xxxx是一个十六进制值,代表编码为xxxx的UTF-16代码单元。此翻译步骤允许任何程序仅使用ASCII字符来表示。


就像一个测试用例一样,这会编译成功 :)

\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0022\u0054\u0068\u0069\u0073\u0020\u0069\u0073\u0020\u0063\u006f\u006f\u006c\u0021\u0022\u0029\u003b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接