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

Zav*_*yan 64 java unicode language-features

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

第一个变体对我有意义 - 它允许程序员用他们选择的国际语言命名变量和方法.但是,我没有看到第二种方法的任何实际应用.

以下是一些用于说明用法的代码,使用Java SE 6和NetBeans 6.9.1进行了测试:

此代码将打印出3.141592653589793

public static void main(String[] args) {
    double ? = Math.PI;
    System.out.println(\u03C0);
}
Run Code Online (Sandbox Code Playgroud)

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

此代码不会打印任何内容

public static void main(String[] args) {
    double ? = Math.PI; /\u002A
    System.out.println(?);

    /* a comment */
}
Run Code Online (Sandbox Code Playgroud)

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

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

    /* a comment */
}
Run Code Online (Sandbox Code Playgroud)

哪个评论打印出来的声明.

仅从我的示例中,我注意到此语言功能存在许多潜在问题.

首先,一个糟糕的程序员可以使用它来秘密注释掉一些代码,或创建多种识别相同变量的方法.也许还有其他可怕的事情可以做,我没有想过.

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

最后,此功能的记录很少,并且不被普遍接受.为什么程序员会在他的代码中使用其他程序员无法识别和理解的东西?事实上,我甚至在Hidden Java Features问题上找不到这个.

我的问题是:

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

Mic*_*rdt 32

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

  • 没有非ASCII字符的风险被无法处理它们的工具破坏.这是在20世纪90年代早期设计Java时的一个真正的问题.发送包含非ASCII字符并使其无法到达的电子邮件是例外而不是常态.

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

第一个变体对我有意义 - 它允许程序员用他们选择的国际语言命名变量和方法.但是,我没有看到第二种方法的任何实际应用.

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

首先,一个糟糕的程序员可以使用它来秘密注释掉一些代码,或创建多种识别相同变量的方法.

如果您担心程序员故意破坏您的代码的可读性,那么这种语言功能是您遇到的最少问题.

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

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

但总的来说,这个功能似乎很少使用,因此可能因此得到了很好的支持.但是,1993年左右设计Java的人怎么会知道呢?

  • `无需告诉编译器和编辑器/ IDE使用哪种编码来解释源代码`:你确定吗?String`System.out.println(\\ u03C0);``US-ASCII`和`UTF-8`编码为27个字节,但`UTF-16`例如输出56个字节.大多数字符集将为此String返回相同的27个字节,但不是全部.所以我猜源文件的编码仍然是一个问题. (2认同)

Ste*_*ker 9

关于\u03C0编码的好处是它不太可能被文本编辑器用错误的编码设置进行操作.例如,我的软件中的一个错误éé由错误配置的文本编辑器从UTF-8意外转换为MacRoman 引起的.通过指定Unicode代码点,您的意思是完全明确的.