javadoc中的Unicode和注释?

时间:2012-04-28 11:48:43

标签: java unicode comments javadoc

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

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

2 个答案:

答案 0 :(得分:13)

  

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

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


man的{​​{1}}页面和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> ... 后,

应该使其使用正确的编码。

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


  

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

用Java处理源文件的算法是

  1. 收集字节
  2. 使用某种编码将字节转换为字符(UTF-16代码单位)。
  3. 替换<encoding-name> '\\'的所有序列,后跟四个十六进制数字,代码单位对应于这些十六进制数字。如果'u'后面没有四个十六进制数字,则输出错误。
  4. 将这些字母改成代币。
  5. 将令牌解析为类。
  6. 当前和以前的做法是将字节转换为UTF-16代码单元的第2步取决于加载编译单元(源文件)的工具,但命令行接口的事实标准是使用"\u"旗帜。

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

    例如:

    \uABCD

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

    int a;
    \u0061 = 42;
    
    解析之前

    。无论\ uABCD序列出现在何处,都会发生这种情况。

    此过程类似于

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

    6.   

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

      除了要在文档中直接显示的(Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))之类的HTML特殊字符外,不需要。您可以在javadoc注释中使用'<'个序列。 解析源文件之前的Java进程\uABCD,以便它们可以真正出现在字符串,注释中。这就是为什么

      \u....

      是一个有效的Java语句。

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

      相当于

      /** @return \u03b8 in radians */
      

      就javadoc而言。


        

      但是Java /** @return θ in radians */ 评论等同于什么?

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

      Java对//序列的处理的一个分支就是

      \uABCD

      看起来像是单行注释,许多IDE会突出显示它,它不是。

答案 1 :(得分:4)

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

<强>的Eclipse

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

double π = Math.PI;

<强>蚂蚁

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

<强>爪哇

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