当前位置: 首页 > 面试题库 >

javadoc中的Unicode和注释?

胡浩瀚
2023-03-14
问题内容

一些编译器对JavaDoc和源代码注释中的非ASCII字符失败。关于Java源文件中的Unicode,当前(Java 7)和将来(Java
8及更高版本)的做法是什么?IcedTea,OpenJDK和其他Java环境之间是否有区别,语言规范规定了什么?是否应使用HTML &escape;
在JavaDoc中对所有​​非A​​SCII字符进行转义 类似的代码?但是,Java //注释 等效项是什么?

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


问题答案:

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

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

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源文件中的Unicode,当前(Java 7)和将来(Java 8及更高版本)的做法是什么?

用Java处理源文件的算法是

  1. 收集字节
  2. 使用某种编码将字节转换为chars(UTF-16代码单元)。
  3. 将所有'\\' 'u'后跟四个十六进制数字的序列替换为与那些十六进制数字相对应的代码单元。如果"\u"后面没有四个十六进制数字,则显示错误。
  4. 将字符转换成令牌。
  5. 将标记解析为类。

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

发生这种转换后,该语言要求\uABCD在进行词法分析和语法分析之前,将样式序列转换为UTF-16代码单元(步骤3)。

例如:

int a;
\u0061 = 42;

是有效的一对Java语句。任何Java源代码工具都必须在将字节转换为char之后但在解析之前,寻找\ 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. Lex: ["int", "a", ";", "a", "=", "42", ";"]
  5. 解析: (Block (Variable (Type int) (Identifier "a")) (Assign (Reference "a") (Int 42)))

是否应使用类似HTML&escape;的代码在JavaDoc中对所有​​非A​​SCII字符进行转义?

不需要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都会这样突出显示它,而实际上不是。



 类似资料:
  • 注意,unicode是转义字符串 我的徒劳尝试到目前为止...

  • 问题内容: 什么时候在方法开始时使用块注释,什么时候使用Javadoc风格的注释? 在Java样式指南的“注释”部分中,我发现了这一点: Java程序可以有两种注释:实现注释和文档注释。实现注释是在C ++中发现的,由,和// 分隔。文档注释(称为“文档注释”)仅适用于Java,并以分隔。可以使用javadoc工具将Doc注释提取到HTML文件中。 实现注释用于注释掉代码或有关特定实现的注释。Do

  • 主要内容:Javadoc标签,Javadoc命令,DOS命令生成API帮助文档 ,MyEclipse生成API帮助文档,文档注释的格式Java 支持 3 种注释,分别是单行注释、多行注释和文档注释。文档注释以 开头,并以 结束,可以通过 Javadoc 生成 API 帮助文档,Java 帮助文档主要用来说明类、成员变量和方法的功能。 文档注释只放在类、接口、成员变量、方法之前,因为 Javadoc 只处理这些地方的文档注释,而忽略其它地方的文档注释。 Javadoc 是 Sun 公司提供的一种工

  • 问题内容: 是否有任何工具/ Eclipse插件可以删除文件中的所有JavaDoc注释? 运行该工具后, 普通 (非JavaDoc)注释 应完整无缺 。 问题答案: 尝试使用此正则表达式在eclipse / sed /您最喜欢的具有正则表达式支持的编辑器中搜索替换。 将输入视为单行 起始字符串 零或更多 负面的展望 空格或非空格字符 尾随字符串 编辑 要解决字符串包含javadoc的情况,请使用此

  • 关于java.lang.enum.values()方法,我有一个非常具体的问题。 我也很好奇为什么不能重写。我在其他问题上读到“它是由编译器生成的”。但有人能更精确一点吗?它似乎是从枚举的名称生成的,但它没有解释原因。

  • 问题内容: 我有一个小的代码示例,我想在方法的Javadoc注释中包括它。 问题是代码示例显示在Javadoc中,没有换行符,很难阅读。 我猜我认为代码标签可以处理换行符是错误的。格式化Javadoc注释中的代码示例的最佳方法是什么? 问题答案: 除了已经提到的标签之外,您还应该使用JavaDoc注释,当涉及到HTML实体问题(尤其是泛型)时,这将使工作变得更加轻松,例如: 将给出正确的HTML输