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 程序甚至可以將表情符號輸出到控制台 😎