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

Why does Java permit escaped unicode characters in the source code?

我最近了解到,在Java源代码中不仅允许Unicode作为Unicode字符(例如EDCOX1(0)),而且还可以作为转义序列(例如EDCOX1(1))。

第一个变量对我来说是有意义的——它允许程序员用自己选择的国际语言命名变量和方法。但是,我看不到第二种方法的任何实际应用。

下面是几个说明使用的代码,用Java SE 6和NETBES67.1进行了测试:

此代码将打印出3.141592653589793

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

说明:π和u03c0是同一个Unicode字符

此代码不会打印出任何内容

1
2
3
4
5
6
public static void main(String[] args) {
    double π = Math.PI; /\u002A
    System.out.println(π);

    /* a comment */
}

说明:以上代码实际编码:

1
2
3
4
5
6
public static void main(String[] args) {
    double π = Math.PI; /*
    System.out.println(π);

    /* a comment */

}

这说明了印刷品的质量。

就从我的例子中,我注意到这个语言特性有很多潜在的问题。

首先,一个不好的程序员可以使用它来秘密地注释代码位,或者创建多种方法来标识同一个变量。也许还有其他我没想到的可怕的事情可以做。

第二,IDES似乎缺乏支持。NetBeans和Eclipse都没有为示例提供正确的代码突出显示。实际上,netbeans甚至标记了一个语法错误(尽管编译不是问题)。

最后,这个特性的文档记录很差,不被普遍接受。为什么程序员会在他的代码中使用其他程序员无法识别和理解的东西?事实上,我甚至找不到关于隐藏Java特性问题的一些信息。

我的问题是:

为什么Java允许在语法中使用Unicode序列?这个功能的一些"优点"允许它保留Java的一部分,尽管它有很多"缺点"?


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

  • 不存在非ASCII字符被无法处理它们的工具破坏的风险。这是20世纪90年代早期设计Java时真正关注的问题。发送一封包含非ASCII字符的电子邮件,并使其未混合到达是一个例外,而不是规范。

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

The first variant makes sense to me -
it allows programmers to name
variables and methods in an
international language of their
choice. However, I don't see any
practical application of the second
approach.

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

First, a bad programmer could use it
to secretly comment out bits of code,
or create multiple ways of identifying
the same variable.

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

Second, there seems to be a lack of support among IDEs.

这不是功能或其设计者的错。但是,我认为它从来没有打算"手动"使用。理想情况下,IDE可以选择让您正常输入字符并使它们正常显示,但自动将它们保存为Unicode转义序列。甚至可能已经有插件或配置选项可以让IDES以这种方式工作。

但一般来说,这一特性似乎很少使用,因此可能受到严重支持。但是1993岁左右设计Java的人怎么会知道呢?


\u03C0编码的好处在于,它不太可能被错误编码设置的文本编辑器吞噬。例如,我的软件中的一个错误是由错误配置的文本编辑器从utf-8 é意外转换为macroman é。通过指定unicode代码点,它完全清楚您的意思。


uxxxx语法允许在文件中明确表示Unicode字符,而该文件的编码不能直接表示这些字符,或者如果您希望保证即使在最小公分母(即7位ASCII编码)中也可以使用表示。

您可以用uxxx表示所有字符,甚至空格和字母,但很少需要这样做。


首先,谢谢你的提问。我觉得很有趣。第二,原因是Java源文件是一个可以使用各种字符集的文本。例如,Eclipse中的默认字符集是CP1255。这个内折不支持π这样的字符。我认为他们考虑的是那些必须在不支持Unicode的系统上工作的程序员,他们希望允许这些程序员创建支持Unicode的软件。这就是支持u符号的原因。