Unicode in javadoc and comments?

2022-09-03 06:41:55

某些编译器在 JavaDoc 和源代码注释中的非 ASCII 字符上失败。在 Java 源文件中,当前(Java 7)和未来(Java 8 及更高版本)的 Unicode 实践是什么?IcedTea,OpenJDK和其他Java环境之间是否存在差异,以及语言规范是什么?是否应该在 JavaDoc 中使用 HTML &escape;-像代码?但是Java //注释的等效物是什么?

更新:注释表示可以使用任何字符集,并且在编译时需要指示源文件中使用的字符集。我将对此进行研究,并将寻找有关如何通过Ant,Eclipse和Maven配置它的详细信息。


答案 1

某些编译器在 JavaDoc 和源代码注释中的非 ASCII 字符上失败。

这可能是因为编译器假定输入为 UTF-8,并且源文件中存在无效的 UTF-8 序列。这些似乎在源代码编辑器中的注释中是无关紧要的,因为词法分析器(将注释与其他标记区分开来)永远不会运行。当工具尝试在词法分析器运行之前将字节转换为字符时,会发生故障。


和 说的页面manjavacjavadoc

-encoding name
          Specifies  the  source  file  encoding   name,   such   as
          EUCJIS/SJIS.   If  this option is not specified, the plat-
          form default converter is used.

所以运行与编码标志javadoc

javadoc -encoding <encoding-name> ...

在替换为用于源文件的编码后,应使其使用正确的编码。<encoding-name>

如果需要一起编译的一组源文件中使用了多种编码,则需要先修复该编码,并对所有源文件进行单一统一编码。你真的应该只使用UTF-8或坚持ASCII。


在 Java 源文件中,当前(Java 7)和未来(Java 8 及更高版本)的 Unicode 实践是什么?

在Java中处理源文件的算法是

  1. 收集字节
  2. 使用某些编码将字节转换为字符(UTF-16 代码单位)。
  3. 将所有后跟四个十六进制数字的序列替换为与这些十六进制数字对应的代码单元。如果后面没有四个十六进制数字,则出错。'\\''u'"\u"
  4. 将字符转换为标记。
  5. 将令牌解析为类。

当前和以前的做法是,步骤 2(将字节转换为 UTF-16 代码单元)取决于加载编译单元(源文件)的工具,但命令行界面的实际标准是使用标志。-encoding

转换发生后,语言要求在词法和分析之前将样式序列转换为 UTF-16 代码单元(步骤 3)。\uABCD

例如:

int a;
\u0061 = 42;

是一对有效的 Java 语句。任何 java 源代码工具都必须在将字节转换为字符之后,但在解析之前,查找 \uABCD 序列并将它们转换为,以便将此代码转换为

int a;
a = 42;

解析之前。无论 \uABCD 序列发生在哪里,都会发生这种情况。

此过程如下所示

  1. 获取字节:[105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
  2. 将字节转换为字符:['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
  3. 替换 unicode 转义:['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
  4. 莱 克 斯:["int", "a", ";", "a", "=", "42", ";"]
  5. 解析:(Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))

在 JavaDoc 中,是否应该使用类似 HTML 的代码对所有非 ASCII 字符进行转义?

除了 HTML 特殊字符(如您希望在文档中按字面意思显示的字符)之外,不需要。您可以在 javadoc 注释中使用序列。Java在解析源文件之前进行处理,以便它们可以出现在字符串,注释中,真正出现在任何地方。这就是为什么'<'\uABCD\u....

System.out.println("Hello, world!\u0022);

是有效的 Java 语句。

/** @return \u03b8 in radians */

等效于

/** @return θ in radians */

就javadoc而言。


但是Java注释的等效物是什么呢?//

您可以在Java中使用注释,但Javadoc只在注释中查找文档。 注释不是携带元数据。///**...*///

Java处理序列的一个后果是,尽管\uABCD

// Comment text.\u000A System.out.println("Not really comment text");

看起来像一个单行注释,许多IDE会这样突出显示它,事实并非如此。


答案 2

正如注释者所指出的,源文件的编码可以传递给(至少一些)编译器。在这个答案中,我将总结如何传递这些信息。

日蚀

Eclipse(3.7 检查)不需要任何特殊配置,您可以愉快地使用 Java 源代码,例如:

double π = Math.PI;

蚂蚁

<javac encoding="UTF-8" ... >
</javac>

爪哇岛

javac -encoding UTF-8 src/main/Foo.java

格雷德尔

javadoc {
    options.encoding = 'UTF-8'
}

推荐