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

Java 字元編碼深度解析:ASCII、ISO-8859-1、Unicode、UTF-8、GB2312 演進脈絡

     編輯:Java 程式設計入門

核心概念釐清

字元集
抽象字元的集合(如「所有中文字」、「ASCII 字元」),只定義「有哪些字」,不定義如何儲存。
字元編碼
將字元集映射為位元組序列的規則(如 UTF-8、GBK),定義「如何存成位元組」。

一個字元集可對應多種編碼(Unicode 對應 UTF-8/UTF-16/UTF-32),但一種編碼只對應一個字元集。

主流編碼歷史演進與技術細節

1. ASCII(American Standard Code for Information Interchange)

  • 位元寬度:7 bits(0~127),常以 1 byte 儲存(最高位固定 0)
  • 涵蓋:控制字元(CR/LF/BS)、英文大小寫、阿拉伯數字、基本標點
  • 缺憾:無法表達西歐語言變音符、東亞漢字、西里爾字母等

2. ISO 8859-1(Latin-1)

  • 擴充策略:沿用 ASCII 0~127,利用 128~255(0x80~0xFF)新增 96 字元
  • 涵蓋:西歐語言(法、德、西、義等)常用變音字母
  • 位元寬度:8 bits = 1 byte,單一字節編碼
  • 局限:仍無法支援中日韓(CJK)字元

3. GB 2312(中國國家標準簡體中文字元集)

  • 發布:1981 年,編號 GB 2312-80
  • 收錄:6,763 漢字(一級 3,755 + 二級 3,008)+ 682 非漢字符號
  • 編碼結構:雙字節(高位 0xA1~0xF7,低位 0xA1~0xFE),共 94×94=8,836 碼位
  • 分區:01~09 區符號,16~55 區一級漢字(按拼音排序),56~87 區二級漢字(按部首/筆畫)
  • 缺口:未收錄繁體字、生僻字、少數民族文字

4. Unicode(通用多八位編碼字元集,UCS)

  • 目標:為全球所有語言字元分配唯一碼位(Code Point)
  • 碼位範圍:U+0000 ~ U+10FFFF(共 17 個平面,每平面 65,536 碼位)
  • 基本多文種平面:U+0000 ~ U+FFFF,涵蓋絕大多數常用字
  • 編碼形式:UTF-8、UTF-16、UTF-32(見下)

5. UTF 系列:Unicode 的具體實作

UTF-8 變長編碼規則

U+0000 ~ U+007F     : 0xxxxxxx                    (1 byte)
U+0080 ~ U+07FF     : 110xxxxx 10xxxxxx           (2 bytes)
U+0800 ~ U+FFFF     : 1110xxxx 10xxxxxx 10xxxxxx  (3 bytes)  ← 大多數漢字
U+10000 ~ U+10FFFF  : 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (4 bytes) ← Emoji、生僻字

Java 中的編碼處理實戰

// 字串 → 位元組陣列(指定編碼)
byte[] utf8Bytes = "中文".getBytes(StandardCharsets.UTF_8);
byte[] gbkBytes  = "中文".getBytes("GBK");  // 需捕獲 UnsupportedEncodingException

// 位元組陣列 → 字串(指定編碼)
String s1 = new String(utf8Bytes, StandardCharsets.UTF_8);
String s2 = new String(gbkBytes, "GBK");

// 檔案讀寫指定編碼 (JDK 7+)
try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8);
     BufferedWriter bw = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) { ... }

常見亂碼根因與排查

  1. 編碼不匹配:UTF-8 位元組以 ISO-8859-1 解碼 → 每個中文字變 2~3 個亂碼字元
  2. 雙重編碼:字串已為 UTF-8,再次 getBytes("UTF-8") → 位元組膨脹
  3. 預設編碼依賴:new String(bytes) 使用平台預設編碼(Windows GBK、Linux UTF-8),跨平台部署必崩

黃金法則:所有跨邊界(網路、檔案、資料庫、JNI)的字串↔位元組轉換,必須顯式指定編碼。

GBK/GB18030 補充

  • GBK:GB 2312 擴充版,收錄 21,000+ 字元(含繁體、日韓字),雙字節,與 GB 2312 相容
  • GB18030:國家強制標準,單/雙/四字節混合,支援 Unicode 所有碼位,向下相容 GBK
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
編碼位元寬度特點適用場景
UTF-8變長 1~4 bytesASCII 兼容(0~127 單字節),無位元組序問題,網頁/傳輸/儲存首選Web、JSON、XML、資料庫、Linux 預設
UTF-162 或 4 bytesBMP 字元固定 2 bytes,補字元用代理對;Java char/String 內部採用Java/.NET 記憶體內部、Windows API
UTF-32固定 4 bytes直接索引碼位,空間浪費大,極少用於儲存/傳輸內部演算法需隨機存取碼位時