以下行来自JLS §3.3:
如果符合条件的\后跟u,或多个,则不遵循最后一个u 通过四个十六进制数字,然后发生编译时错误。
所以这意味着以下几行会产生相同的结果:
System.out.println("\u0065"); // prints "e"
System.out.println("\uu0065"); // prints "e"
System.out.println("\uuu0065"); // prints "e"
在u
中使用单个\uXXXX
与在uu
中使用\uuXXXX
基本相同。我的问题是,为什么我们需要这种设计?
答案 0 :(得分:5)
原因在引用的部分稍后陈述:
Java编程语言指定了一种将用Unicode编写的程序转换为ASCII的标准方法,该程序将程序更改为可由基于ASCII的工具处理的形式。转换涉及通过添加额外的u来将程序源文本中的任何Unicode转义转换为ASCII - 例如,\ uxxxx变为\ uuxxxx - 同时将源文本中的非ASCII字符转换为包含单个u的Unicode转义符。
这意味着它使转换为ASCII完全可逆,因为您知道哪些转义序列最初在代码中,哪些是转换添加的。
答案 1 :(得分:3)
Answer by Henry提供完整的信息,但不是外行术语。
幕后发生的事情是源中的每个字符都转换为Unicode转义序列。所以当我们写这样的东西时:
ሴ
转换为:
\u1234 // Escape sequence for `ሴ` is `\u1234`.
现在,当我们写:
\u1234ሴ
转换为:
\uu1234\u1234
这是为了向后兼容。通过使用这种过程,我们可以从转义序列中恢复原始的ASCII字符。
在源代码中输入的转发序列与ex \u1234
一样,将获得uu
并替换为\uu1234
,而没有转义序列的字符会获得单个u
,因此{{ 1}}将导致ሴ
。
以下行来自同一部分,即JLS §3.3:
Unicode转义生成的字符不参与进一步的Unicode转义。
这些段落现在很有意义:
Java编程语言指定了转换a的标准方法 用Unicode编写的ASCII程序,将程序更改为可由基于ASCII的工具处理的表单。转换涉及通过添加额外的u来将程序源文本中的任何Unicode转义转换为ASCII - 例如,\ uxxxx变为\ uuxxxx - 同时将源文本中的非ASCII字符转换为包含单个u的Unicode转义符
这个转换版本同样可以被Java编译器接受,并代表完全相同的程序。 稍后可以通过将存在多个u的每个转义序列转换为一个较少的u 的Unicode字符序列,从此ASCII表单中恢复确切的Unicode源,同时将每个转义序列转换为单个u到相应的单个Unicode字符。