【发布时间】:2012-12-03 23:00:20
【问题描述】:
我想将 aphostrophe 的值分配给一个字符:
char a = '\'';
但是我想使用 unicode 版本的撇号 (\u0027) 以使其与我的代码保持一致:
char a = '\u0027';
但是这样做会产生一个错误,说“未封闭的字符文字”。
如何在代码中仍然包含 unicode 代码的情况下执行此任务?
【问题讨论】:
我想将 aphostrophe 的值分配给一个字符:
char a = '\'';
但是我想使用 unicode 版本的撇号 (\u0027) 以使其与我的代码保持一致:
char a = '\u0027';
但是这样做会产生一个错误,说“未封闭的字符文字”。
如何在代码中仍然包含 unicode 代码的情况下执行此任务?
【问题讨论】:
\u0027 不起作用的原因是编译器很早就处理了 unicode 转义,当然,它最终是 '——它终止了文字。编译器实际上看到了这个:
char a = ''';
...这自然是个问题。 JLS 在 §3.10.4(Character Literals)中讨论了与换行有关的问题。
坦率地说,我认为你最好写
char a = '\'';
...但是char 是数字类型,所以你可以这样做:
char a = 0x0027;
当然,您可以这样做:
char a = "\u0027".charAt(0);
...但我认为我们都同意这有点矫枉过正。 ;-)
哦,或者查看Greg's answer:char a = '\u005c\u0027';(\u005c 当然是一个反斜杠——所以编译器会看到'\'')。
【讨论】:
\u0027 被编译器很早就处理了,所以这可能最终成为他最好的(甚至可能是唯一的)选项。
'\u000a' 这样的东西,因为它在类被编译之前就被处理成了一个换行符。
你也可以这样做
char a = '\u005c\u0027';
其中 \u005c 是 \
的 Unicode【讨论】:
\u0027 的原因,这是一个非常好的主意...
这是另一种选择,不过确实有点矫枉过正:
char c = "\u0027".charAt(0);
【讨论】:
在 javac 做任何其他事情之前,它首先将所有 \u#### 转换为 char。所以你的代码相当于
char a = ''';
这就是它无法编译的原因。
\u#### 不仅适用于字符/字符串文字,您可以在任何地方使用它,例如在变量名中。
然而,人们很少在标识符中使用非拉丁字符;如果有人这样做,他可能会使用他的本地字符集,而且他也不需要 \u####。
因此,除了字符/字符串文字之外,我们从未真正在任何地方看到 \u####,这会给不知情的人留下错误的印象。
如果有时间机器,我们可能应该取消此功能,因为它令人困惑且未被使用。
【讨论】: