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

“我一定會用它來找點樂子的!”