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

Java 文件編碼深度解析:UTF-8、GBK、UTF-16 與亂碼根因

     編輯:Java 綜合教學

常見編碼字節佔用對比

編碼漢字英文/數字備註
UTF-16BE2 字節2 字節固定長度,大端序
UTF-83 字節1 字節變長,ASCII 兼容
GBK2 字節1 字節中文 Windows 預設
ANSI2 字節1 字節中文環境下等同 GBK

Java 內部編碼機制

  • Java char / String 內部採用 UTF-16BE(雙字節)
  • 一個 char 可存一個漢字(BMP 範圍),補充字符需 代碼點 / char[] 組合
  • 項目預設編碼為 GBK(早期版本),現代建議統一 UTF-8

核心原則:編碼解碼必須一致

// 錯誤:bytes 為 UTF-8,卻用 GBK 解碼 → 亂碼
String str = new String(bytes); // 平台預設 GBK

// 正確:顯式指定編碼
String str = new String(bytes, StandardCharsets.UTF_8); // Java 7+
// 或
String str = new String(bytes, "UTF-8");

文件讀寫最佳實踐

// 讀取:指定編碼
try (BufferedReader br = new BufferedReader(
        new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
    String line;
    while ((line = br.readLine()) != null) { ... }
}

// 寫入:指定編碼
try (BufferedWriter bw = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8))) {
    bw.write(content);
}

IDE 與專案編碼陷阱

  • Eclipse/IDEA 專案編碼設置決定源文件讀寫編碼
  • UTF-8 專案複製 GBK 文件內容 → 自動轉碼,通常不亂碼
  • UTF-8 專案直接複製 GBK 文件(二進制)→ 打開顯示亂碼,需轉碼後再導入
  • 建議:全專案統一 UTF-8,編譯輸出也設為 UTF-8(-encoding UTF-8)

亂碼排查清單

  1. 確認源數據實際編碼(用十六進制編輯器查看字節)
  2. 確認解碼時使用的編碼是否與源一致
  3. 檢查中間傳輸環節(HTTP header、DB 連接屬性、文件讀寫 API)是否指定編碼
  4. 控制台輸出編碼是否匹配(IDE Run Configuration → Encoding)

掌握「字節序列 ↔ 字符串」雙向轉換的編碼一致性原則,是解決 99% 亂碼問題的關鍵。

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