为什么Java允许在源代码中转义unicode字符?

我最近了解到 ,在Java源代码中,Unicode不仅可以用作Unicode字符(例如double \u03C0 = Math.PI; ),还可以用作转义序列(例如double \u03C0 = Math.PI; )。

第一个变体对我来说很有意义 – 它允许程序员用自己select的国际语言来命名variables和方法。 但是,我没有看到第二种方法的实际应用。

以下是一些用于说明使用情况的代码段,使用Java SE 6和NetBeans 6.9.1进行了testing:

此代码将打印出3.141592653589793

 public static void main(String[] args) { double π = Math.PI; System.out.println(\u03C0); } 

说明:π和\ u03C0是相同的Unicode字符

这段代码不会打印出任何东西

 public static void main(String[] args) { double π = Math.PI; /\u002A System.out.println(π); /* a comment */ } 

说明:上面的代码实际上编码为:

 public static void main(String[] args) { double π = Math.PI; /* System.out.println(π); /* a comment */ } 

哪些评论印刷品。

从我的例子来看,我注意到这个语言特性存在一些潜在的问题。

首先,一个不好的程序员可以用它来暗中注释掉一些代码,或者创build多种识别同一个variables的方法。 也许还有其他可怕的事情可以做,我没有想到。

其次,IDE之间似乎缺乏支持。 NetBeans和Eclipse都没有为示例提供正确的代码突出显示。 实际上,NetBeans甚至标记了语法错误(尽pipe编译不是问题)。

最后,这个function没有文档logging,也没有被普遍接受。 为什么程序员在他的代码中使用某些其他程序员无法识别和理解的东西? 事实上,我甚至无法在“ 隐藏的Java特性”问题上find有关此问题的信息 。

我的问题是这样的:

为什么Java允许在语法中使用转义的Unicode序列? 这个function的某些“优点”是什么让它保留了Java的一部分,尽pipe有很多“缺点”?

Unicode转义序列允许您以纯ASCII存储和传输您的源代码,并仍然使用整个Unicode字符范围。 这有两个好处:

  • 没有非ASCII字符被无法处理它们的工具破坏的风险。 Java是在20世纪90年代初devise的时候,这是一个真正的问题。 发送包含非ASCII字符的电子邮件并使其到达不受限制是一个例外情况,而不是规范。

  • 不需要告诉编译器和编辑器/ IDE使用哪种编码来解释源代码。 这仍然是一个非常有效的关注。 当然,更好的解决scheme是将编码作为元数据放在文件头中(如XML),但是这还没有成为当时的最佳实践。

第一个变体对我来说很有意义 – 它允许程序员用自己select的国际语言来命名variables和方法。 但是,我没有看到第二种方法的实际应用。

两者都会产生完全相同的字节码,并且具有与语言function相同的function。 唯一的区别是在源代码中。

首先,一个不好的程序员可以用它来暗中注释掉一些代码,或者创build多种识别同一个variables的方法。

如果你担心程序员故意破坏你的代码的可读性,那么这个语言特性是你的问题中最less的。

其次,IDE之间似乎缺乏支持。

这不是function或其devise师的错。 但是,我不认为它曾经打算被“手动”使用。 理想情况下,IDE可以select让您正常input字符并正常显示,但会自动将它们保存为Unicode转义序列。 甚至可能已经有插件或configuration选项,使IDE的行为。

但总的来说,这个function似乎很less使用,因此可能得不到很好的支持。 但是在1993年前后deviseJava的人怎么会知道呢?

关于编码的好处在于,使用错误的编码设置的文本编辑器不太可能使用它。 例如,我的软件中的一个错误是由错误configuration的文本编辑器意外地将UTF-8转换成MacRoman。 通过指定Unicode代码点,您的意思是完全毫不含糊的。

\ uXXXX语法允许Unicode字符在不能直接expression它们的编码文件中明确表示,或者即使在最小公分母(即7位ASCII编码)中也保证可用表示。

可以使用\ uXXXX 表示所有的字符,甚至是空格和字母,但是很less需要。

首先,感谢你的问题。 我觉得这很有趣。 其次,原因是java源文件是一个文本,可以使用自己的各种字符集。 例如Eclipse中的默认字符集是Cp1255。 这个编码不支持π这样的字符。 我认为他们认为程序员必须在不支持unicode的系统上工作,并且希望允许这些程序员创build支持unicode的软件。 这是支持符号的理由。