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

2022-08-31 15:02:24

我最近了解到,Unicode在Java源代码中是允许的,而不仅仅是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功能问题中找不到有关此内容的信息。

我的问题是这样的:

为什么Java允许在语法中使用转义Unicode序列?这个特性有哪些“优点”,尽管它有很多“缺点”,但它们仍然成为Java的一部分?


答案 1

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

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

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

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

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

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

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

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

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

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


答案 2

编码的好处是,它具有错误编码设置的文本编辑器不太可能对其进行修改。例如,我的软件中的一个错误是由错误配置的文本编辑器从UTF-8意外转换为MacRoman引起的。通过指定 Unicode 代码点,您的意思完全不含糊。\u03C0éé


推荐