Java 中的 Unicode 转义语法

2022-09-02 03:36:55

在Java中,我了解到以下语法可用于提及不在键盘上的Unicode字符(例如非ASCII字符):

(\u)(u)*(HexDigit)(HexDigit)(HexDigit)(HexDigit)

我的问题是:上述语法中(u)*的目的是什么?

我理解的在Java中表示日元符号的一个用例是:

char ch = '\u00A5';

答案 1

有趣的问题。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转义”。uuu

当您想要从 ASCII 转换回 Unicode 时,此信息非常有用:您可以尽可能多地还原原始代码。


答案 2

这意味着您可以根据需要添加任意数量 - 例如,这些行是等效的:u

char ch = '\u00A5';
char ch = '\uuuuu00A5';
char ch = '\uuuuuuuuuuuuuuuuuu00A5';

(和所有编译)


推荐