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

Java 字元編碼入門(五):Java 程式碼中的字元編碼轉換與 IO 體系

     編輯:Java 相關知識

Java 內部編碼機制與 IO 轉換完整指南

JVM 內部統一使用 UTF-16 表示字元,所有編碼轉換發生在 JVM 與外部系統 (檔案、網路) 邊界。本文詳細解析 Java IO 體系、Reader/Writer 隱式轉換、OutputStreamWriter 顯式指定編碼的正確用法。

核心原則:JVM 內部唯一編碼

char han = '漢';           // 記憶體中實際為 0x6C49 (UTF-16)
System.out.format("%x", (short) han); // 輸出: 6c49

char han2 = 0x6c49;        // 以 UTF-16 編碼指定字元
System.out.println(han2);  // 輸出: 漢

結論:正確讀入字元後,記憶體中一定是 UTF-16 編碼值,無其他可能。

編碼轉換發生邊界:IO 流體系

IO 體系架構

兩大陣營

類別面向特性適用場景
InputStream/OutputStream位元組二進制完全一致,無轉換圖片、影音、二進制檔案
Reader/Writer字元隱式使用系統預設編碼轉換文字檔案、跨平台文字處理

Reader/Writer 的隱性轉換行為

  • 讀取:檔案位元組 → 系統預設編碼解碼 → 記憶體 UTF-16 char
  • 寫入:記憶體 UTF-16 char → 系統預設編碼編碼 → 檔案位元組
  • 限制:無法指定編碼,僅使用 file.encoding 系統屬性 (中文 Windows 為 GBK)

編碼轉換關鍵類:InputStreamReader / OutputStreamWriter

位元組流與字元流之間的轉接器,**唯一可指定編碼的實例化時機**

正確寫入 UTF-8 檔案範例

try (PrintWriter out = new PrintWriter(
        new OutputStreamWriter(
            new FileOutputStream("c:/utf-8.txt"), "UTF-8"))) {
    out.write("漢");
} catch (IOException e) {
    throw new RuntimeException(e);
}

驗證結果

使用 UltraEdit 以十六進制開啟 utf-8.txt:

E6 B1 89  // "漢" 的 UTF-8 編碼 (3 bytes)

常見錯誤模式

錯誤代碼問題修正
new FileWriter("a.txt")使用系統預設編碼 (GBK),跨平台亂碼new OutputStreamWriter(new FileOutputStream("a.txt"), "UTF-8")
new FileReader("a.txt")假設系統預設編碼,讀取 UTF-8 檔案亂碼new InputStreamReader(new FileInputStream("a.txt"), "UTF-8")
new String(bytes)使用系統預設編碼解碼位元組陣列new String(bytes, "UTF-8")
str.getBytes()使用系統預設編碼編碼字串str.getBytes("UTF-8")

網路傳輸編碼處理

// HTTP 請求讀取
BufferedReader reader = new BufferedReader(
    new InputStreamReader(connection.getInputStream(), "UTF-8"));

// HTTP 回應寫入
OutputStreamWriter writer = new OutputStreamWriter(
    connection.getOutputStream(), "UTF-8");

結語

牢記「JVM 內部 UTF-16,邊界處轉換」,養成**所有 IO 操作顯式指定編碼**習慣,是解決亂碼問題的根本之道。

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