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

时间:2010-12-15 08:50:22

标签: java unicode language-features

I recently learned在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);
}

说明:π和\ 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 */
}

哪个评论打印出来。

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

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

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

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

我的问题是:

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

4 个答案:

答案 0 :(得分:31)

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

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

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

  

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

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

  

首先,一个糟糕的程序员可以使用它   偷偷评论出一些代码,   或创造多种识别方式   相同的变量。

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

  

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

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

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

答案 1 :(得分:8)

\u03C0编码的好处在于,文本编辑器使用错误的编码设置进行编辑的可能性要小得多。例如,我的软件中的一个错误是由错误配置的文本编辑器从UTF-8 é意外转换为MacRoman é引起的。通过指定Unicode代码点,您的意思完全明确。

答案 2 :(得分:3)

\ uXXXX语法允许在具有不能直接表达它们的编码的文件中明确地表示Unicode字符,或者如果您希望表示即使在最小公分母中也能保证可用,即7位ASCII编码

可以用\ uXXXX代表你的所有角色,甚至空格和字母,但很少需要。

答案 3 :(得分:2)

首先,谢谢你的提问。我觉得这很有意思。 其次,原因是java源文件是一个可以自己使用各种字符集的文本。例如,Eclipse中的默认字符集是Cp1255。此编码不支持像π这样的字符。我认为他们认为程序员必须在不支持unicode的系统上工作,并希望允许这些程序员创建支持unicode的软件。这是支持\ u表示法的原因。