首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Unicode 轉義字符陷阱:\u000a 與 \u0027 導致編譯錯誤

     編輯:Java 相關知識

現象

Java 源碼中可使用 Unicode 轉義(如 \u4f60 表示「你」),編碼無關,不會亂碼。但某些特殊轉義字符會在編譯早期被直接替換為對應字符,導致語法錯誤。

兩個危險字符

轉義字符問題
\u000aLine 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、\"、\'、\\。
  • 若需表示 Unicode 字符,確保不屬於上述特殊控制字符。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved