javadoc中的Unicode和注释?
某些编译器在JavaDoc和源代码注释中的非ASCII字符上失败。 Java源文件中关于Unicode的当前(Java 7)和未来(Java 8及更高版本)实践是什么? IcedTea,OpenJDK和其他Java环境之间是否存在差异,以及语言规范的含义是什么? 是否应该使用HTML 和转义在JavaDoc中转义所有非ASCII字符; 像代码? 但Java //评论等同于什么?
更新 :注释表明可以使用任何字符集,并且在编译时需要指示源文件中使用的字符集。 我将研究这个,并将寻找有关如何通过Ant,Eclipse和Maven配置它的详细信息。
某些编译器在JavaDoc和源代码注释中的非ASCII字符上失败。
这很可能是因为编译器假定输入为UTF-8,并且源文件中存在无效的UTF-8序列。 这些似乎在您的源代码编辑器中的注释中是无关紧要的,因为词法分析器(区分注释与其他令牌)永远不会运行。 当工具尝试在词法分析器运行之前将字节转换为字符时发生故障。
javac
和javadoc
的man
页说
-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 ...
将
替换为您用于源文件的编码后,应该使其使用正确的编码。
如果您需要在一组源文件中使用多个编码,并且需要一起编译,则需要先修复该编码,然后对所有源文件采用单一统一编码。 你应该只使用UTF-8或坚持使用ASCII。
Java源文件中关于Unicode的当前(Java 7)和未来(Java 8及更高版本)实践是什么?
用Java处理源文件的算法是
- 收集字节
- 使用某种编码将字节转换为字符(UTF-16代码单元)。
- 替换
'\\'
'u'
所有序列,后跟四个hex数字,代码单元对应于这些hex数字。 如果"\u"
后面没有四个hex数字,则输出错误。 - Lex把这些字母变成了代币。
- 将标记解析为类。
当前和以前的做法是,将字节转换为UTF-16代码单元的步骤2取决于加载编译单元(源文件)的工具,但命令行接口的事实标准是使用-encoding
标志。
在转换发生之后,语言要求在进行lexing和解析之前将\uABCD
样式序列转换为UTF-16代码单元(步骤3)。
例如:
int a; \u0061 = 42;
是一对有效的Java语句。 在将字节转换为字符之后但在解析之前,任何java源代码工具都必须查找\ uABCD序列并转换它们,以便将此代码转换为
int a; a = 42;
在解析之前。 无论\ uABCD序列出现在何处,都会发生这种情况。
这个过程看起来像
- 获取字节:
[105, 110, 116, 32, 97, 59, 10, 92, 117, 48, 48, 54, 49, 32, 61, 32, 52, 50, 59]
- 将字节转换为字符:
['i', 'n', 't', ' ', 'a', ';', '\n', '\\', 'u', '0', '0', '6', '1', ' ', '=', ' ', '4', '2', ';']
- 替换unicode转义:
['i', 'n', 't', ' ', 'a', ';', '\n', a, ' ', '=', ' ', '4', '2', ';']
- Lex:
["int", "a", ";", "a", "=", "42", ";"]
- 解析:(
(Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))
是否所有非ASCII字符都在JavaDoc中使用HTML&escape; -like代码进行转义?
除了要在文档中直接显示的'<'
类'<'
HTML特殊字符外,无需任何其他内容。 您可以在javadoc注释中使用\uABCD
序列。 Java进程\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会突出显示它,但事实并非如此。
正如评论者指出的那样,源文件的编码可以传递给(至少一些)编译器。 在这个答案中,我将总结如何传递这些信息。
日食
Eclipse(3.7已检查)不需要任何特殊配置,您可以愉快地使用Java源代码,如:
double π = Math.PI;
ant
Java的
javac -encoding UTF-8 src/main/Foo.java