【问题标题】:Java Unicode translationJava Unicode 翻译
【发布时间】:2012-12-07 11:06:27
【问题描述】:

我遇到了以下代码:

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 替换?我认为编译器应该先忽略 cmets,然后再进行代码翻译。

编辑:

不确定以上是否足够清楚。

我知道上述情况会发生什么以及为什么会出错。我的期望是编译器在对代码进行任何翻译之前应该忽略所有注释行。显然这里不是这样。我期待这种行为的基本原理。

【问题讨论】:

标签: java unicode


【解决方案1】:

它在 Java Puzzlers #14 - 解释的摘录:

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

JLS v7 中的相关段落是paragraph 3.3:

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

JLS 第 3 节的介绍暗示了为什么会出现这种情况:

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

【讨论】:

  • 这解释了为什么编译器会出错。但我的问题是:为什么编译器会解析 unicode before 忽略代码中的 cmets。
  • @user1885220 因为它是语言规范的一部分。如果您的问题是“为什么以这种方式指定语言?”,我不知道。
  • @user1885220 必须先处理 Unicode 转义,才能允许在标识符中使用非 ASCII 字符的 native2ascii-ing 代码:int é = 5; -> int \u00e9 = 5;
  • @user1885220 回复。您的更新:该行为的基本原理是您的编译器符合语言规范!
  • @assylias 对于每个编译器错误都可以这么说:“您的代码不符合语言规范”。我认为 Ian Roberts 回答了我的要求。
【解决方案2】:

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

此规则适用于全局,特别是您甚至可以使用 Unicode 转义来转义注释标记。比如下面两个sn-ps是一样的:

// 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 转义之前尝试删除 cmets,它最终会剥离从 /*, etc.handle("/*", "*/ 的所有内容,留下

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

然后将其转义为单行注释,然后在解析的下一阶段删除。因此不会产生编译器错误或警告,而是默默地删除一整行代码......

【讨论】:

  • +1,我想你明白了为什么会这样。另一个答案仅说明了我已经在问题/ cmets 中发布的语言规范。你的例子很到位!
  • C# 很好地解决了这个问题,cmets 中的 Unicode 转义仍然被忽略。如果你可以写 `` 那么就不需要转义它,因为许多编译器不能处理 Unicode 字符,因为它已经在 ASCII 范围内。这样可以防止很多意想不到的事情发生,例如 stackoverflow.com/q/27332545/995714stackoverflow.com/q/3866187/995714stackoverflow.com/q/30727515/995714
猜你喜欢
  • 1970-01-01
  • 2015-01-13
  • 2014-05-18
  • 1970-01-01
  • 2011-03-20
  • 2014-10-12
  • 2021-11-30
  • 2014-08-10
  • 2023-04-06
相关资源
最近更新 更多