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

为什么Java允许在源代码中转义unicode字符?,java,unicode,language-features,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(Str

我认为在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甚至标记了一个语法错误(尽管编译不是问题)

最后,此功能的文档记录不完整,不被普遍接受。为什么程序员会在代码中使用其他程序员无法识别和理解的东西?事实上,我甚至在网上找不到关于这个的东西

我的问题是:

为什么Java允许在语法中使用转义的Unicode序列?
尽管有许多“缺点”

编码的好处是,它不太可能被错误的编码设置的文本编辑器屏蔽。例如,我的软件中的一个bug是由配置错误的文本编辑器意外地从UTF-8
ee
转换为MacRoman
ee
引起的。通过指定Unicode代码点,您的意思就完全明确了。

首先,谢谢您的提问。我觉得很有趣。
其次,原因是java源文件是一个文本,可以使用各种字符集。例如,Eclipse中的默认字符集是Cp1255。此赋码不支持π等字符。我认为他们想到了必须在不支持unicode的系统上工作的程序员,并希望允许这些程序员创建支持unicode的软件。这就是支持\u符号的原因

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

  • 没有非ASCII字符被无法处理的工具破坏的风险。早在20世纪90年代初设计Java时,这是一个真正的问题。发送一封包含非ASCII字符的电子邮件,并让它以不混淆的方式到达是一个例外,而不是常态

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

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

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

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

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

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

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


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

uxxx语法允许Unicode字符以无法直接表达的编码在文件中清晰地表示出来,或者如果您想要一种即使在最小公分母下也能使用的表示法,即7位ASCII编码


您可以用\uxxx来表示所有字符,甚至是空格和字母,但几乎不需要这样做。

“首先,一个糟糕的程序员可以用它来…”一个糟糕的程序员会找到另一种方法使代码更糟,即使没有unicode转义。当然,一个糟糕的程序员总会找到方法使代码更糟。我想说的是,Java设计人员做出了深思熟虑的决定,以尽量减少滥用。例如,多继承、指针、宏和运算符重载是C++中常见的做法,但在爪哇中不包括。为了额外的乐趣,将代码< > /\U22A < /代码>移到右侧,在IDE的视口外。@ TyBrBeLeNey,因为该树不在Unicode的BMP(基本多语言平面)中。Java允许在Java源代码中使用BMP中的任何字符。@vurp0,