javadoc中的Unicode和注释?

Ego*_*gen 13 java unicode comments javadoc

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

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

Mik*_*uel 13

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

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


man对页面javacjavadoc

-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.
Run Code Online (Sandbox Code Playgroud)

所以运行javadoc编码标志

javadoc -encoding <encoding-name> ...
Run Code Online (Sandbox Code Playgroud)

<encoding-name>您用于源文件的编码替换后,应该使用正确的编码.

如果您需要在一组源文件中使用多个编码,并且需要一起编译,则需要先修复该编码,然后对所有源文件采用单一统一编码.你应该只使用UTF-8或坚持使用ASCII.


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

用Java处理源文件的算法是

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

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

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

例如:

int a;
\u0061 = 42;
Run Code Online (Sandbox Code Playgroud)

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

int a;
a = 42;
Run Code Online (Sandbox Code Playgroud)

在解析之前.无论\ 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)))

是否所有非ASCII字符都在JavaDoc中使用HTML&escape; -like代码进行转义?

除了'<'要在文档中直接显示的HTML特殊字符外,不需要.您可以\uABCD在javadoc注释中使用序列.\u....解析源文件之前的Java进程,以便它们可以在任何地方出现在字符串,注释中.这就是为什么

System.out.println("Hello, world!\u0022);
Run Code Online (Sandbox Code Playgroud)

是一个有效的Java语句.

/** @return \u03b8 in radians */
Run Code Online (Sandbox Code Playgroud)

相当于

/** @return ? in radians */
Run Code Online (Sandbox Code Playgroud)

就javadoc而言.


但Java //评论相当于什么?

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

Java处理\uABCD序列的一个分支就是尽管如此

// Comment text.\u000A System.out.println("Not really comment text");
Run Code Online (Sandbox Code Playgroud)

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

  • @Marcin,是的.源代码编码是PITA.许多较新的语言强制要求或强烈建议将UTF-8作为其源文件的编码格式.[JSON](http://www.ietf.org/rfc/rfc4627.txt)和[Python的](http://docs.python.org/py3k/reference/lexical_analysis.html)默认的"默认的编码是UTF -8","默认为UTF-8".[Go](http://golang.org/ref/spec)和[Rust](http://doc.rust-lang.org/doc/rust.html)更严格:"源代码是Unicode文本编码的UTF-8","输入被解释为以UTF-8编码的Unicode代码点序列." Java应该用于`-source 1.7`. (2认同)

Ego*_*gen 5

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

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

double ? = Math.PI;
Run Code Online (Sandbox Code Playgroud)

蚂蚁

<javac encoding="UTF-8" ... >
</javac>
Run Code Online (Sandbox Code Playgroud)

爪哇

javac -encoding UTF-8 src/main/Foo.java
Run Code Online (Sandbox Code Playgroud)

摇篮

javadoc {
    options.encoding = 'UTF-8'
}
Run Code Online (Sandbox Code Playgroud)