首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 編碼難題:Unicode 與 UTF-8 的轉換機制詳解

     編輯:程式設計綜合問答

問題背景

Java 內部使用 UTF-16(char 類型佔 2 字節)表示字符,而 UTF-8 編碼中漢字通常佔 3 字節。這一差異常導致 I/O 操作時的亂碼問題。

核心機制

  1. 內存中:String 以 UTF-16 代碼單元序列存儲,BMP 字符 1 個 char,補充字符 2 個 char(代理對)。
  2. 輸出時:經 OutputStreamWriter 或 String.getBytes(charset) 按指定編碼(如 UTF-8)轉為字節流。
  3. 輸入時:經 InputStreamReader 或 new String(bytes, charset) 從字節流解碼為 UTF-16 String。

常見坑點與對策

  • 默認編碼不一致:Windows 默認 GBK,Linux 默認 UTF-8。務必顯式指定編碼,勿依賴平台默認值。
  • 層層轉碼:数据库、JDBC、Web 容器、JSP 頁面編碼需統一為 UTF-8。
  • BOM 頭干擾:UTF-8 文件若含 BOM,Java 讀取時會將其視為字符內容,需手動跳過。

代碼示範

// 寫入文件指定 UTF-8
try (Writer w = new OutputStreamWriter(new FileOutputStream("out.txt"), StandardCharsets.UTF_8)) {
    w.write("中文");
}

// 讀取指定編碼
String content = new String(Files.readAllBytes(Paths.get("in.txt")), StandardCharsets.UTF_8);

總結

理解 Java 內部 UTF-16 與外部 UTF-8 的轉換邊界,並在所有 I/O 邊界顯式聲明編碼,是解決亂碼的根本之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved