java - javadoc 和注释中的 Unicode?

标签 java unicode comments javadoc

一些编译器无法处理 JavaDoc 和源代码注释中的非 ASCII 字符。关于 Java 源文件中的 Unicode,当前(Java 7)和 future (Java 8 及更高版本)的做法是什么? IcedTea、OpenJDK 和其他 Java 环境之间是否存在差异,语言规范有何规定? JavaDoc 中的所有非 ASCII 字符是否都应使用类似 HTML &escape; 的代码进行转义?但是 Java //comment 的等价物是什么?

更新:注释表明可以使用任何字符集,编译时需要指出源文件中使用的是什么字符集。我将对此进行调查,并将寻找有关如何通过 Ant、Eclipse 和 Maven 进行配置的详细信息。

最佳答案

Some compilers failed on non-ASCII characters in JavaDoc and source code comments.

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


man javac 的页面和 javadoc

-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。


What is the current (Java 7) and future (Java 8 and beyond) practices with respect to Unicode in Java source files?

Java处理源文件的算法是

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

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

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

例如:

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)))

Should all non-ASCII characters be escaped in JavaDoc with HTML &escape;-like codes?

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

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

是有效的 Java 语句。

/** @return \u03b8 in radians */

相当于

/** @return θ in radians */

就 javadoc 而言。


But what would be the Java // comment equivalent?

您可以使用 //在 java 中注释,但 Javadoc 只查看内部 /**...*/文档的评论。 //评论不携带元数据。

Java 处理 \uABCD 的一个分支序列是,虽然

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

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

关于java - javadoc 和注释中的 Unicode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10363188/

相关文章:

xml - 如何使用 Twig 模块从 XML 中删除注释

java - JButton 切换方法未按预期工作

Java Web 服务 session 管理

java - 对于大于 150kb 的文件上传请求参数为 null,多部分文件上传,Spring 3.2,wildfly 9.0.0

java - 如果文件已重命名,如何找到文件扩展名?

android - 在txt中查找unicode字符 - android

formatting - 好的评论用例

javascript - 是否有关于如何用注释记录 JavaScript 文件的约定?比如函数签名、示例等

c - 带有 unicode 路径的 gtk_file_chooser_get_filename

python - 仅匹配 Python re 中的 unicode 字母