作为 Codegym 大学课程一部分的导师授课片段。报名参加完整课程。


“你好,阿米戈。曾几何时,你了解到要在代码中编写一串字符,你需要将它们用双引号括起来。”

“是的,这给了我们一个字符串文字。不久前我才发现这个。”

“在我们的行业中,那是很久以前的事了。但现在这不是重点。相反,请告诉我如果我们需要在字符串文字中使用引号该怎么办?”

“嗯……一个包含引号的字符串——还有什么比这更简单的呢。我相信有一些办法……”

“是的。假设我们想要显示文本"Friends" was nominated for an "Oscar"。我们该怎么做呢?”

“老实说,我不知道。我想不出任何东西。”

“你无法通过逻辑找到解决方案。让我告诉你该怎么做。

代码 笔记
String s = ""Friends" was nominated for an "Oscar"";
这个选项不会起作用!”

“这个选项不起作用,因为编译器将其解释为完全不同的代码:

代码 笔记
String s = ""Friends" was nominated for an "Oscar"";
这个选项不会起作用!”

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

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

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

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

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

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

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

“嗯,我不会说这个超级方便……”

“但是你能做什么,这些是规则。另一个重要的一点。反斜杠前面的引号代表一个字符:我们只是使用巧妙的符号,不会干扰编译器识别我们的字符串文字的能力代码。您可以将引号分配给char变量:

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

转义字符时常见的情况

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

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

\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");
Hel World

\r是回车符

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

例子:

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

\f是一个换页字符

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

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

\\是反斜杠

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

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

例子:

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

“使用双斜线是有道理的。但我还不能立即记住其他所有内容。我将不得不依靠你的提示。”

“渐渐地,你会记住你需要什么。别担心。对于其他一切,有谷歌。

Unicode编码

“你已经知道屏幕上显示的每个字符都对应一个特定的数字代码。这些代码的标准化集合称为编码

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

“真是个奇怪的名字。”

“这没什么奇怪的,就是一个缩写。ASCII代表美国信息交换标准代码——一个标准的美国代码表,用于可打印字符和一些特殊代码。”

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

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

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

Unicode编码

”于是,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

Unicode:代码点

“640 KB 应该对每个人都足够了!或者不是”。比尔盖茨曾经说过。或不。至少这句话是他说的。”

“哈哈,640kb,连一个扫地机器人的大脑都装不下。”

“生活很艰难,随着时间的推移,UTF-16 编码开始不够用了。原来有很多亚洲语言,它们有很多字形。而所有这些字形根本无法塞入 2 个字节”

“那么我们该怎么办?”

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

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

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

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

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

“我一定会用它来找点乐子的!”