Java 源碼中可使用 Unicode 轉義(如 \u4f60 表示「你」),編碼無關,不會亂碼。但某些特殊轉義字符會在編譯早期被直接替換為對應字符,導致語法錯誤。
| 轉義 | 字符 | 問題 |
|---|---|---|
\u000a | Line Feed (換行符 LF) | 導致字符字面量斷行,編譯錯誤 |
\u0027 | 單引號 (') | 導致字符字面量提前結束,編譯錯誤 |
// 錯誤:編譯器將 \u000a 替換為實際換行
char c = '\u000a';
// 變為
char c = '
'; // 語法錯誤
// 錯誤:\u0027 被替換為單引號
char c = '\u0027';
// 變為
char c = '''; // 語法錯誤
System.out.println("a\u0022.length()+\u0022b".length());
直觀以為輸出 26 或 16,實際輸出 2。原因:\u0022 是雙引號,編譯器將代碼轉換為:
String str = "a".length()+"b";
System.out.println(str.length()); // "a1b".length() = 3? 實際邏輯需細究
更極端例子:構造惡意代碼字符串經編譯器轉義後可執行任意邏輯(文中演示構造反射調用拋出異常)。
Java 語言規範 (JLS 3.2) 規定:Unicode 轉義在詞法分析階段最先處理,早於語法解析。因此轉義字符直接參與語法結構構建。
\u000a、\u000d、\u0022、\u0027、\u005c(反斜杠)。\n、\r、\"、\'、\\。