在Unicode的Javadoc和意见吗?(Unicode in javadoc and comme

2019-06-24 00:54发布

一些编译器失败的在Javadoc和源代码注释非ASCII字符。 什么是Java源文件的电流(Java 7中)和将来(的Java 8及以后)的做法相对于Unicode的? 是否有IcedTea项目,OpenJDK的,和其他Java环境之间的差异,是什么决定的语言规范? 如果所有非ASCII字符的JavaDoc进行转义使用HTML 和逃脱的。 样的代码? 但是,什么是评论等同于Java的//?

更新 :评论表明,人们可以使用任何字符集,以及一旦编译一个需要指出哪些字符集是在源文件中使用。 我会考虑这一点,将寻找如何通过Ant,Eclipse和Maven的配置此细节。

Answer 1:

一些编译器失败的在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.

因此运行javadoc与编码标志

javadoc -encoding <encoding-name> ...

更换后的<encoding-name>与您已经用了你的源文件的编码应使其使用正确的编码。

如果你有一组需要一起编译源文件中使用一个以上的编码,你需要修复的第一和定居在一个统一的编码对所有的源文件。 你真的应该只使用UTF-8还是坚持ASCII。


什么是Java源文件的电流(Java 7中)和将来(的Java 8及以后)的做法相对于Unicode的?

该算法与源文件在处理Java是

  1. 收集字节
  2. 字节转换为使用一些编码字符(UTF-16编码单元)。
  3. 替换的所有序列'\\' 'u' ,接着用对应于这些十六进制数字的代码单元4个十六进制数字。 错误了,如果有一个"\u"不跟四个十六进制数字。
  4. 莱克斯的字符为标记。
  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)))

如果所有非ASCII字符的JavaDoc进行转义使用HTML和逃生;般的代码?

无需除HTML特殊字符,如'<'要在文档中出现字面上。 您可以使用\uABCD javadoc注释里面的序列。 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将突出它是这样,它不是。



Answer 2:

作为评论者指示的,源文件的编码可以被传递到(至少一些)编译器。 在这个答案,我会总结如何将此信息传递。

日食

蚀(3.7选中)不需要任何特殊的配置,你可以愉快地使用Java源代码,如:

double π = Math.PI;

蚂蚁

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

Java的

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


文章来源: Unicode in javadoc and comments?