为什么Java允许在源代码中转义unicode字符?
我认为在Java源代码中,Unicode不仅可以作为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
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
转换为MacRomanee
引起的。通过指定Unicode代码点,您的意思就完全明确了。首先,谢谢您的提问。我觉得很有趣。
其次,原因是java源文件是一个文本,可以使用各种字符集。例如,Eclipse中的默认字符集是Cp1255。此赋码不支持π等字符。我认为他们想到了必须在不支持unicode的系统上工作的程序员,并希望允许这些程序员创建支持unicode的软件。这就是支持\u符号的原因 Unicode转义序列允许您以纯ASCII存储和传输源代码,并且仍然使用整个Unicode字符范围。这有两个好处:
- 没有非ASCII字符被无法处理的工具破坏的风险。早在20世纪90年代初设计Java时,这是一个真正的问题。发送一封包含非ASCII字符的电子邮件,并让它以不混淆的方式到达是一个例外,而不是常态
- 无需告诉编译器和编辑器/IDE使用哪种编码来解释源代码。这仍然是一个非常值得关注的问题。当然,更好的解决方案是将编码作为元数据放在文件头中(如XML),但这在当时还没有成为最佳实践
但总的来说,这个功能似乎很少使用,因此可能得不到很好的支持。但是,1993年左右设计Java的人怎么会知道呢?uxxx语法允许Unicode字符以无法直接表达的编码在文件中清晰地表示出来,或者如果您想要一种即使在最小公分母下也能使用的表示法,即7位ASCII编码
您可以用\uxxx来表示所有字符,甚至是空格和字母,但几乎不需要这样做。“首先,一个糟糕的程序员可以用它来…”一个糟糕的程序员会找到另一种方法使代码更糟,即使没有unicode转义。当然,一个糟糕的程序员总会找到方法使代码更糟。我想说的是,Java设计人员做出了深思熟虑的决定,以尽量减少滥用。例如,多继承、指针、宏和运算符重载是C++中常见的做法,但在爪哇中不包括。为了额外的乐趣,将代码< > /\U22A < /代码>移到右侧,在IDE的视口外。@ TyBrBeLeNey,因为该树不在Unicode的BMP(基本多语言平面)中。Java允许在Java源代码中使用BMP中的任何字符。@vurp0,