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

Ani*_*wat 1 java jls

以下行来自JLS§3.3:

如果符合条件的\后跟u 或者多个u,并且最后一个u后面没有四个十六进制数字,则会发生编译时错误.

所以这意味着以下几行将产生相同的结果:

System.out.println("\u0065");   // prints "e"
System.out.println("\uu0065");  // prints "e"
System.out.println("\uuu0065"); // prints "e"
Run Code Online (Sandbox Code Playgroud)

使用单一的u\uXXXX本质上是做一样的使用uu\uuXXXX.我的问题是,为什么我们需要这种设计?

Hen*_*nry 5

原因在引用的部分稍后陈述:

Java编程语言指定了一种将用Unicode编写的程序转换为ASCII的标准方法,该程序将程序更改为可由基于ASCII的工具处理的形式.转换涉及通过添加额外的u来将程序源文本中的任何Unicode转义转换为ASCII - 例如,\ uxxxx变为\ uuxxxx - 同时将源文本中的非ASCII字符转换为包含单个u的Unicode转义符.

这意味着它使转换为ASCII完全可逆,因为您知道哪些转义序列最初在代码中,哪些转义是通过转换添加的.


Ani*_*wat 5

亨利的回答提供了完整的信息,但不是外行的。

幕后发生的事情是源中的每个字符都被转换为 Unicode 转义序列。所以当我们写这样的东西时:

?
Run Code Online (Sandbox Code Playgroud)

它被转换为:

\u1234 // Escape sequence for `?` is `\u1234`.
Run Code Online (Sandbox Code Playgroud)

现在,当我们写:

\u1234?
Run Code Online (Sandbox Code Playgroud)

它被转换为:

\uu1234\u1234
Run Code Online (Sandbox Code Playgroud)

这样做是为了向后兼容。通过使用这种程序,我们可以从转义序列中恢复原始的 ASCII 字符。

在源代码中输入的转义序列如 for ex\u1234将得到uu并替换为 ,\uu1234而没有转义序列的字符得到一个单一的u,因此?将导致\u1234.

以下行来自同一部分,即JLS §3.3

Unicode 转义产生的字符不参与进一步的 Unicode 转义。

这些段落现在更有意义:

Java 编程语言指定了将用 Unicode 编写的程序转换为 ASCII 的标准方法,该方法将程序更改为可由基于 ASCII 的工具处理的形式。转换涉及通过添加额外的 u 将程序源文本中的任何 Unicode 转义转换为 ASCII - 例如,\uxxxx 变为 \uuxxxx - 同时将源文本中的非 ASCII 字符转换为每个包含一个 u 的 Unicode 转义.

这个转换后的版本同样可以被 Java 编译器接受,并且代表完全相同的程序。稍后可以通过将每个存在多个 u 的转义序列转换为一个少一个 u 的 Unicode 字符序列,同时将每个具有单个 u 的转义序列转换为相应的单个 Unicode来从此 ASCII 形式恢复确切的 Unicode 源。特点。