1.转义字符的原因

曾几何时,您了解到为了在代码中编写一串字符,您需要将它们用双引号引起来。结果是一个字符串文字

但是如果我们需要在字符串文字中使用引号怎么办?一个包含引号的字符串——还有什么比这更简单的呢?

假设我们要显示文本"Friends" was nominated for an "Oscar"。你是怎样做的?

代码 笔记
String s = ""Friends" was nominated for an "Oscar"";
该选项将不起作用!

问题是编译器认为您正在编写完全意外的代码:

代码 笔记
String s = ""Friends" was nominated for an "Oscar"";
该选项将不起作用!

编译器在代码中遇到双引号后,会将后面的内容视为字符串文字的开头。下一个双引号表示字符串文字的结尾。

那么如何在文字中写双引号呢?


2.转义字符

有一种方法。它被称为转义字符。您只需在文本字符串中写上引号。在引号之前,添加\反斜杠)符号。

这是正确编写后的字符串文字的样子:

代码 笔记
String s = "\"Friends\" was nominated for an \"Oscar\"";
这将工作!

编译器将正确解释所有内容,不会将反斜杠后的引号视为普通引号。

更重要的是,如果你将这个字符串输出到屏幕上,带有反斜杠的引号将被正确处理,并且文本将在没有任何反斜杠的情况下显示:"Friends" was nominated for an "Oscar"

另一个重点。前面有反斜杠的引号表示单个字符:我们只是使用了不会干扰编译器识别代码中字符串文字的能力的灵活表示法。您可以为char变量分配引号:

代码 笔记
char c = '\"';
\"是一个字符,不是两个
char c = '"';
这也是可能的:单引号内的双引号

3.转义字符时常见的情况

涉及转义字符的常见情况

除了双引号之外,编译器还以特殊方式处理许多其他字符。例如,换行符。

我们如何为文字添加换行符?还有一个特殊的组合:

\n
换行字符

如果需要为字符串文字添加换行符,只需添加几个字符:\n.

例子:

代码 控制台输出
System.out.println("Best regards, \n Anonymous");
Best regards,
Anonymous

像这样的特殊组合一共有8种,也叫转义序列。他们来了:

代码 描述
\t 插入制表
\b 插入退格字符
\n 插入换行符_
\r 插入回车
\f 插入换页
\' 插入单引号
\" 插入双引号
\\ 插入反斜杠

你熟悉其中两个,但其他 6 个是什么意思?

\t是制表符

当文本中出现这段文字时,相当于Tab在打字的同时按下了键。它移动其后的文本并使对齐文本成为可能。

例子:

代码 控制台输出
System.out.println("0\t1\t2\t3");
System.out.println("0\t10\t20\t30");
System.out.println("0\t100\t200\t300");
0       1        2        3
0       10       20       30
0       100      200      300

\b意思是“返回一个字符”

字符串中的这个序列相当于按下Backspace键盘上的键。它删除它前面的字符:

代码 控制台输出
System.out.println("Hello\b\b World");
Hell World!

\r是回车符

此字符将光标移动到当前行的开头而不更改文本。接下来显示的任何内容都将覆盖现有字符串。

例子:

代码 控制台输出
System.out.println("Greetings\r World!");
World!

\f是一个换页字符

这个符号是从第一台点阵打印机时代就流传下来的。将此序列输出到打印机将导致打印机简单地送出当前页面,而不打印任何文本,直到新页面开始。

现在我们称它为分页符新页

\\是反斜杠

这里的一切都很简单。如果我们使用反斜杠来转义文本中的字符,那么我们如何在字符串中写入反斜杠字符本身呢?

很简单:在文本中添加一个反斜杠——你必须连续写两个。

例子:

代码 控制台输出
System.out.println("c:\projects\my\first");
编译器会对未知的转义字符大喊大叫。
System.out.println("c:\\projects\\my\\first");
这样做就对了!


4.Unicode编码

如您所知,屏幕上显示的每个字符都对应一个特定的数字代码。这些代码的一组标准化称为编码

曾几何时,当计算机刚刚发明时,七位(不到一个字节)就足以对每个字符进行编码。第一个编码仅包含 128 个字符。这种编码称为ASCII

ASCII代表美国信息交换标准代码 — 用于可打印字符和一些特殊代码的标准美国代码表。

它由 33 个不可打印的控制字符(影响文本和空格的处理方式)和 95 个可打印字符组成,包括数字、大写和小写拉丁字母以及几个标点符号。

Unicode编码

随着计算机的普及,每个国家都开始发布自己的编码。通常,他们以 ASCII 作为起点,并用各自字母表中的符号替换很少使用的 ASCII 字符。

随着时间的推移,一个想法出现了:创建一个包含世界上每个编码的所有字符的单一编码。

Unicode 编码 1

于是,在 1993 年,Unicode编码被创造出来,Java 语言成为第一个使用这种编码作为存储文本标准的编程语言。现在 Unicode 是整个 IT 行业的标准。

虽然 Unicode 本身是标准,但它有几种表示或 Unicode 转换格式 (UTF):UTF-8、UTF-16 和 UTF-32 等。

Java 使用 Unicode 编码的高级版本——UTF-16:每个字符以 16 位(2 字节)编码。它最多可容纳 65,536 个字符!

您几乎可以在这种编码中找到世界上每个字母表的每个字符。自然,没有人能记住全部内容。你不可能什么都知道,但你可以谷歌一切。

要使用其代码在您的程序中编写 Unicode 字符,您需要编写\u+十六进制代码。例如,\u00A9

代码 控制台输出
System.out.println("\u00A9 CodeGym");
© CodeGym


5. Unicode:代码点

“640 KB 应该对每个人都足够了!或者不是”。(引用自比尔·盖茨)

生活坎坷,久而久之,UTF-16编码开始力不从心。原来有很多亚洲语言,它们有很多字形。而所有这些字形根本无法塞入 2 个字节。

可以做什么?使用更多字节

但是 char 类型只有 2 个字节,改成 4 个并不是那么容易:全世界已经编写了数十亿行 Java 代码,如果 char 类型突然变成 4 个字节,Java 机器就会崩溃。所以我们不能改变char类型!

还有另一种方法。记住我们如何通过在字符前面放置反斜杠来转义字符。基本上,我们使用多个字符对单个字符进行编码。

Java 的创建者决定使用相同的方法。

一些在视觉上显示为单个字符的字符char在字符串中被编码为两个 s:

代码 控制台输出
System.out.println("\uD83D\uDD0A");
🔊

现在您的 Java 程序甚至可以将表情符号输出到控制台 😎