使用十六进制字符串字面量,我可以做什么?

5

我正在学习Java,目前看的是一个关于十六进制字符串字面量的章节。书上告诉我可以用"\uxxxx"这种格式来创建一个十六进制字符串字面量。所以我试了一下:

char c = '\u0010';
int x = c;
System.out.println(x);  // prints 16.

首先,为什么以下十六进制字符串字面量会导致编译错误?我预期在十六进制中的 'a' 应该等于十进制中的 10。

char c = '\u000a';

返回以下错误:
..\src\pkgs\main\Main.java:360: error: illegal line end in character literal
                char c = '\u000a';

其次,由于我是Java的初学者,目前还不能理解何时使用十六进制字符串常量。为什么要使用它们?能否请提供一个“实际应用”的示例?非常感谢。


嗯,奇怪的是,因为 '\u000b' 确实可以工作 ... 你第一次尝试时可能遇到了一个独特的字符 :p - fge
3个回答

7
编译器报错是因为编译器将解析\u000aCR
char A = '\u000A';

因此,它变得...
char A ='
';

这会导致编译时出现错误。为了避免这种错误,应该始终使用特殊的转义字符'\n'(换行)和'\r'(回车)。


引号会消失吗?难道不是 char A='<CR>';(其中CR是打破行的零宽空格吗?) - quetzalcoatl
1
我认为你的“因此变成”应该是 char A = '(new line)';。请注意,char A =; 会产生不同的错误。 - Bernhard Barker
嗯,好的,知道了...(顺便问一下,\r 的等效字符是什么?) - fge
quetzalcoatl和Dukeling是正确的。如果不是这样,编译器错误就不会是“字符文字中的非法行结尾”。(我已经为您编辑过了。) - T.J. Crowder
@fge: \n 是字符10(0x0a)。\r 是字符13(0x0d)。 - T.J. Crowder

4
如前所述,Unicode转义实际上是在编译期间进行替换的(链接1)
由于Unicode转义非常早地进行处理,因此不正确的写法是将'\u000a'用于值为换行符(LF)的字符字面量;Unicode转义\u000a在翻译步骤1(§3.3)中被转换为实际的换行符,而换行符在步骤2(§3.4)中变成LineTerminator,因此字符字面量在步骤3中无效。相反,应该使用转义序列'\n'(§3.10.6)。同样,对于值为回车符(CR)的字符字面量,不正确的写法是'\u000d',而应使用'\r'。
Unicode转义的这个方面不仅限于字符字面量。例如,以下代码将打印“hello world”:
// \u000A System.out.println("hello world");

除了使用转义符外,获取特殊字符的另一种方式是使用整数字面量:

static final char NUL = 0x0000;

关于它们的实用性,首先,如果没有它们,您就必须复制并粘贴特殊字符或使用某些键盘组合键进行输入。另一个原因是某些字符没有适当的视觉表示。例如,null、escape、backspace和delete。还有代码点7,响铃字符,它实际上是一条指令,让计算机在打印时发出蜂鸣声。

0

Java中的Char类型占用2个字节,因此您可以使用char打印Unicode字符。 因此,如果您知道Unicode字符代码,则可以将其存储为十六进制文字,并且您可以使用其他语言的字符。

您可以访问此链接: http://voices.yahoo.com/how-print-unicode-characters-java-12507717.html

了解十六进制文字的使用方法


为什么这个答案被踩了?在我的原帖中,我希望有人能回答“其次...”部分。不幸的是,我并没有完全理解这个答案。能否请有人详细说明一下@Mo.Ashfaq的意思?谢谢。 - user2911290
@user2911290,请查看我编辑过的答案。 - Mohammad Ashfaq
@user2911290 可能被投票否决是因为第一句话是错误的。你不能使用char表示所有Unicode字符。支持char的十六位(一对八位字节)具有大约65,000个范围。但是Unicode定义了超过110,000个编号跨越100万以上的字符。因此,char不可能表示所有Unicode字符。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接