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

Java 字元編碼深度解析:ASCII、ISO-8859-1、Unicode、UTF-8、GB2312 技術特點與轉換原理

     編輯:Java 相關知識

Java 字元編碼體系完整技術指南

字元編碼是資訊交換基石。Java 內部使用 UTF-16 (char 2 位元組),但 I/O 涉及多種編碼轉換。本文系統整理主流編碼技術特點、轉換原理與 Java 處理實務。

核心概念釐清

  • 字元集:字元集合 (如 Unicode、GB2312)
  • 編碼方案:字元對應位元組序列規則 (如 UTF-8、UTF-16BE)
  • 碼點:字元在字元集中的數值編號 (Unicode: U+0000 ~ U+10FFFF)

主流編碼技術特點對比

編碼位元寬度涵蓋範圍技術特點適用場景
ASCII7-bit (1 byte)128 字元控制碼 + 英文大小寫 + 數字 + 符號早期系統、協定基礎
ISO-8859-1 (Latin-1)8-bit (1 byte)256 字元ASCII 擴展 + 西歐語言附加符號舊版 Web、HTTP 預設
Unicode (UCS-2/UTF-16)16-bit (2 bytes)BMP (65536字元)固定長度,Java char/內部預設記憶體內部處理
UTF-8變長 1-4 bytes全 Unicode (111萬+)ASCII 相容 (1 byte)、多語言混排節省空間Web 標準、檔案儲存、網路傳輸
GB2312雙位元組6763 漢字 + 682 符號高位 0xA1-0xF7,低位 0xA1-0xFE,一級漢字 0xB0+中文舊系統、中國大陸標準
GBK/GB18030雙/四位元組擴展漢字 + 少數民族字GB2312 超集,GB18030 為國家強制標準中文現代系統

UTF-8 編碼演算法詳解

位元組結構:

  • 1 位元組:0xxxxxxx (U+0000 ~ U+007F,ASCII 相容)
  • 2 位元組:110xxxxx 10xxxxxx (U+0080 ~ U+07FF)
  • 3 位元組:1110xxxx 10xxxxxx 10xxxxxx (U+0800 ~ U+FFFF,含中日韓)
  • 4 位元組:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (U+10000 ~ U+10FFFF,Emoji、罕用字)

範例:

  • 'A' (U+0041) → 41 (1 byte)
  • '中' (U+4E2D) → E4 B8 AD (3 bytes)
  • '😀' (U+1F600) → F0 9F 98 80 (4 bytes)

Java 編碼轉換核心 API

String ↔ byte[] 轉換


// 解碼: bytes → String (指定編碼)
String str = new String(bytes, StandardCharsets.UTF_8);
String str = new String(bytes, "GBK"); // 繁體/簡體混合常用

// 編碼: String → bytes (指定編碼)
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
byte[] bytes = str.getBytes("GB2312");

Reader/Writer 字元流 (自動編碼轉換)

// 讀取 UTF-8 檔案
try (BufferedReader reader = new BufferedReader(
        new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8))) {
    String line;
    while ((line = reader.readLine()) != null) { ... }
}

// 寫入 GBK 檔案
try (BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(file), "GBK"))) {
    writer.write("中文內容");
}

Charset/CharsetEncoder/CharsetDecoder 進階控制

Charset utf8 = StandardCharsets.UTF_8;
CharsetEncoder encoder = utf8.newEncoder()
    .onMalformedInput(CodingErrorAction.REPORT)
    .onUnmappableCharacter(CodingErrorAction.REPLACE)
    .replaceWith("?");

ByteBuffer bb = encoder.encode(CharBuffer.wrap("測試"));

常見亂碼場景與解決

現象原因解決
中文顯示 ??? 或 編碼不支援該字元 (如 ISO-8859-1 讀中文)指定正確編碼 (UTF-8/GBK)
中文變亂碼 (??)雙重編碼/解碼錯誤 (UTF-8 bytes 用 GBK 解碼)統一編碼、檢查傳輸鏈路
檔案讀取首行有隱形字元UTF-8 BOM (EF BB BF)用 BOMInputStream 或手動跳過
資料庫存取亂碼JDBC URL 缺 characterEncoding、DB/表/欄編碼不一致URL 加 useUnicode=true&characterEncoding=UTF-8
網頁表單提交亂碼頁面 encoding、form accept-charset、Server.xml URIEncoding 不一全鏈路 UTF-8、Tomcat 設 URIEncoding=UTF-8

最佳實務原則

  1. 全鏈路 UTF-8:原始碼、編譯、資料庫、網頁、檔案、JVM (-Dfile.encoding=UTF-8)
  2. 邊界明確指定:所有 I/O 邊界 (檔案、網路、資料庫) 顯式指定編碼,勿依賴預設
  3. 內部統一 String:JVM 內部一律使用 String (UTF-16),邊界才編碼/解碼
  4. 使用 StandardCharsets:StandardCharsets.UTF_8 等常數避免拼字錯誤、保證平台支援
  5. 錯誤處理策略:REPLACE (替換 ?)、IGNORE (忽略)、REPORT (拋異常) 視業務而定

掌握編碼本質、Java API 正確用法、全鏈路一致性,是解決亂碼問題的根本之道。

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