Puzzle 15: Hello Whirled

转义字符在注释中的问题

以下代码:

/**

* Generated by the IBM IDL-to-Java compiler, version 1.0

* from F:\TestRoot\apps\a1\units\include\PolicyHome.idl

* from F://TestRoot//apps//a1//units//include//PolicyHome.idl

* Wednesday, June 17, 1998 6:44:40 o'clock AM GMT+00:00

*/

public class Test {

public static void main(String[] args) {

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

}

}

应该输出:Hello, world!吗?

(⊙_⊙), 代码居然不能通过编译. 以下是NetBeans中的截图, 称为「非法的Unicode转义」, 在java源码中正确使用转义字符要求\u后面跟上4位字符的16进制的Unicode编码.

一个例子讲到了代码中使用Unicode字符的问题, 这个问题更明确说明了连注释中也要注意Unicode的使用.

如上, 这种错误在一般的IDE环境中都能自动检测到, 它不太可能存在于手写的Java代码中. 但有大量代码是程序自动生成的, 仍然可能导致上面的问题. 只要不使用Windows的文件分隔符, 那么这个问题还是能避免的. 比如这个问题中, 第5行注释换成第六行的就没有问题了. 或者将\用它的转义字符\u005c代替(部分符号的转义字符可以在JLS 3.10.6查到), 那么第五行改成:

  • * from F:\TestRoot\apps\a1\u005cunits\include\PolicyHome.idl

在Java源文件的注释中, 为了表示一些特殊的字符, 通常使用Java的转义字符或者HTML的实体转义字符(HTML entity escapes), 比如字符é的Unicode转义字符为\u00E9, HTML 的实体转义字符为é 在代码注释中使用它们三种中的任意一种, 在生成的doc文件里, 都将显示字符é.

  1. 老早在JW@TW上问到过关于\u的问题. (TODO 链接)
  2. Puzzle 14: Escape Rout
  3. JLS 3.10.6 Escape Sequences for Character and String Literals