1. 常見的特殊字元與跳躍
在程式設計中,字串不僅由字母組成,也包含各種特殊字元:引號、換行、定位字元,有時甚至還有像 \n 與 \t 這樣的記號。不過,如果你想在字串裡寫下 你好, "user"!,編譯器就會問:「字串裡的引號——這是錯誤嗎?」這時就需要跳脫機制。
在 Java 中,跳脫 是在字串內對某些字元「特別處理」的方式。為此會使用反斜線 \(backslash)。
經典的特殊字元:
| 序列 | 說明 | 示範 |
|---|---|---|
|
換行 | 按下 Enter |
|
定位字元(Tab) | Tab |
|
字面上的「反斜線」 | |
|
字串內的雙引號 | |
|
單引號(在字串中較少需要) | |
|
歸位(Carriage Return,舊式換行,較少使用) | |
|
NUL 字元 | (不可見) |
|
退格(刪除前一個字元——在主控台不一定有效) |
如何運作
我們來寫幾行帶有跳脫字元的字串,看看它們的效果。
System.out.println("你好,\"使用者\"!");
// 輸出:你好,"使用者"!
System.out.println("C:\\Program Files\\MyApp");
// 輸出:C:\Program Files\MyApp
System.out.println("第 1 行\n第 2 行");
// 輸出:
// 第 1 行
// 第 2 行
System.out.println("我\t喜歡\t定位字元!");
// 輸出:
// 我 喜歡 定位字元!
像這樣,靠著一個小小的反斜線(\),你就能把幾乎任何特殊字元「帶進」字串,而不會讓編譯器或同事驚慌。
2. 多行字串與換行
我們很常需要寫多行訊息或 ASCII 藝術。最直接的方式——是在一般字串中使用 \n。
System.out.println("第一行\n第二行\n第三行");
不過這並不總是方便,因此 Java 出現了 文字區塊(Text Blocks)。它們以三個引號 """ 開始,能讓你在不需跳脫的情況下撰寫多行文字並保留格式——非常適合 JSON、SQL 與 HTML。
// 多行字面值(Text Block)
String json = """
{
"name": "Alice",
"age": 30,
"skills": ["Java", "SQL", "Cloud"]
}
""";
System.out.println(json);
"""
透過文字區塊,也能輕鬆建立包含引號的多行文字,而不必重複跳脫它們。
3. Unicode —— Java 如何儲存全世界的任何字元
在現代開發中,我們處理的不僅是拉丁字母,還有西里爾字母、漢字、數學符號,甚至 emoji。這一切都要歸功於字元編碼系統——Unicode。
什麼是 Unicode?
Unicode 是一個國際標準,為每個字元指派唯一的編號(code point),不受語言與平台限制。因此你可以在 Java 同時使用西里爾文、英文、中文漢字,甚至各種罕見的特殊符號。
不同語言的字串範例:
System.out.println("Hello, 世界! 你好! مرحبا!");
字串中的 Unicode 字元
你可以直接輸入任何你的編碼所支援的字元,或使用 \uXXXX 形式的跳脫序列,其中 XXXX 是 4 位十六進位碼。
System.out.println("符號: \u263A"); // 會輸出 😊
對於碼位超過 65535 的字元(例如許多表情符號)會使用代理對(UTF-16):
// 字元 😊(碼位 1F60A)由兩個 char 表示
System.out.println("表情: \uD83D\uDE0A"); // 會輸出 😊
這能帶來什麼好處?
- 你可以儲存並處理任何文字。
- 不必擔心混用語言或使用非標準符號——Java 開箱即支援 Unicode。
- 面向國際使用者與非常用字母的情境時格外重要。
4. 字串中的表情符號與特殊字元
現代的字串不僅是字母,還有 emoji!例如,你想傳給使用者一則帶著「笑臉」的訊息。
如何把表情符號放進字串?
直接把 emoji 放進字串:
System.out.println("你好! 😊");
使用 Unicode 碼位: 對多數表情符號,可以使用代理對序列。
System.out.println("這是小貓: \uD83D\uDC31"); // 🐱
Emoji 在字串中可能會占兩個字元(因為 UTF-16)。因此在某些操作(例如取得長度)時,可能會有意外:
String s = "😊";
System.out.println(s.length()); // 會輸出 2,而不是 1!
這是因為在 Java 中,一個 Unicode code point 會以兩個 char 編碼。要正確處理字元,請使用 code point 與相應的方法,而不是單純呼叫 length()。
5. 陷阱與常見錯誤
錯誤 1:在字串內錯誤使用引號。 如果不跳脫內部引號,編譯器會「以為」字串已經結束。
System.out.println("他說: "你好!""); // 錯誤!
正確:
System.out.println("他說: \"你好!\"");
錯誤 2:路徑中只用單個反斜線。 在 Java 中,\ 用於特殊字元(\n、\t、\f 等)。因此字串 "C:\Temp\file.txt" 會被錯誤解讀。
System.out.println("C:\Temp\file.txt"); // 錯誤或非預期的結果
正確:
System.out.println("C:\\Temp\\file.txt"); // 使用雙反斜線
錯誤 3:忽略文字區塊。 自 Java 15 起,請使用 文字區塊——這能大幅簡化多行字串的處理。
String path = """
C:\Temp\file.txt
""";
System.out.println(path);
最重要的原則:務必跳脫特殊字元與引號。這能避免隱藏的 bug,並節省大量除錯時間。
GO TO FULL VERSION