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的一部分?
答案 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表示法的原因。