\ uXXXX,\ uuXXXX和\ uuuXXXX之间的区别

时间:2018-01-18 12:43:08

标签: java jls

以下行来自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基本相同。我的问题是,为什么我们需要这种设计?

2 个答案:

答案 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字符。