Java 中的 Unicode 转义语法
在Java中,我了解到以下语法可用于提及不在键盘上的Unicode字符(例如非ASCII字符):
(\u)(u)*(HexDigit)(HexDigit)(HexDigit)(HexDigit)
我的问题是:上述语法中(u)*的目的是什么?
我理解的在Java中表示日元符号的一个用例是:
char ch = '\u00A5';
在Java中,我了解到以下语法可用于提及不在键盘上的Unicode字符(例如非ASCII字符):
(\u)(u)*(HexDigit)(HexDigit)(HexDigit)(HexDigit)
我的问题是:上述语法中(u)*的目的是什么?
我理解的在Java中表示日元符号的一个用例是:
char ch = '\u00A5';
有趣的问题。JLS的第3.3节说:
UnicodeEscape:
\ UnicodeMarker HexDigit HexDigit HexDigit HexDigit
UnicodeMarker:
u
UnicodeMarker u
它翻译为\\u+\p{XDigit}{4}
和
如果符合条件的 \ 后跟 u 或多个 u,并且最后一个 u 后面没有四个十六进制数字,则会发生编译时错误。
所以你是对的,反斜杠后面可以有一个或多个。原因进一步给出:u
Java 编程语言指定了一种将用 Unicode 编写的程序转换为 ASCII 的标准方法,该方法将程序更改为可由基于 ASCII 的工具处理的形式。转换涉及通过添加一个额外的 u(例如,\uxxxx 变为 \uuxxxx)将程序源文本中的任何 Unicode 转义转换为 ASCII,同时将源文本中的非 ASCII 字符转换为每个包含单个 u 的 Unicode 转义。
这个转换后的版本对于Java编译器来说同样可以接受,并且表示完全相同的程序。稍后,通过将存在多个 u 的每个转义序列转换为具有较少 u 的 Unicode 字符序列,同时将具有单个 u 的每个转义序列转换为相应的单个 Unicode 字符,可以稍后从此 ASCII 形式恢复确切的 Unicode 源。
所以这个输入
\u0020ä
成为
\uu0020\u00e4
第一个意思是“这是一个unicode转义序列开始”,而第二个说“自动工具将非ASCII字符转换为unicode转义”。uu
u
当您想要从 ASCII 转换回 Unicode 时,此信息非常有用:您可以尽可能多地还原原始代码。
这意味着您可以根据需要添加任意数量 - 例如,这些行是等效的:u
char ch = '\u00A5';
char ch = '\uuuuu00A5';
char ch = '\uuuuuuuuuuuuuuuuuu00A5';
(和所有编译)