以下行来自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.我的问题是,为什么我们需要这种设计?
原因在引用的部分稍后陈述:
Java编程语言指定了一种将用Unicode编写的程序转换为ASCII的标准方法,该程序将程序更改为可由基于ASCII的工具处理的形式.转换涉及通过添加额外的u来将程序源文本中的任何Unicode转义转换为ASCII - 例如,\ uxxxx变为\ uuxxxx - 同时将源文本中的非ASCII字符转换为包含单个u的Unicode转义符.
这意味着它使转换为ASCII完全可逆,因为您知道哪些转义序列最初在代码中,哪些转义是通过转换添加的.
亨利的回答提供了完整的信息,但不是外行的。
幕后发生的事情是源中的每个字符都被转换为 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 源。特点。
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |