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

Java 字元編碼入門(二):編碼字元集與字元集編碼的本質區別

     編輯:Java 相關知識

核心概念釐清:Coded Character Set vs Character Encoding Scheme

Unicode/UCS 皆為「編碼字元集」而非「字元集編碼」。理解此區別是掌握所有編碼轉換、標準轉換的關鍵鑰匙。本文系統建立抽象字元集→編碼字元集→字元集編碼三層架構認知。

三層架構定義

1. 抽象字元集 (Abstract Character Repertoire)

  • 純字元集合,無順序、無編號
  • 忽略具體表現形式 (字型、聲音、點陣、向量)
  • 例如:「所有漢字」、「所有英文字母」、「全球所有語言符號」

2. 編碼字元集 (Coded Character Set - CCS)

  • 為抽象字元集每個字元分配**整數編號** (Code Point)
  • 建立順序與唯一識別:Unicode 為「漢」分配 U+6C49 (第 27,721 個字元)
  • 同一字元在不同 CCS 編號不同:Big5 中「兒」為 0xA449,Unicode 為 0x513F
  • 不同字元在不同 CCS 可能同號:英文 "A" 在 ASCII/Unicode 皆為 0x41

3. 字元集編碼 (Character Encoding Scheme - CES)

  • 將 CCS 整數編號**轉換為位元組序列**的規則
  • 決定記憶體/磁碟實際儲存的二進制值

主流編碼方案對比

歷史演進:UCS 與 Unicode 合併

  • UCS-2:固定 2 bytes,僅支援 BMP (無 Surrogate Pair)
  • UCS-4:固定 4 bytes,相當於 UTF-32
  • 1991 年合併:統一字元集、前 65,535 字元編號一致、碼空間限制 110 萬
  • 現今提及 Unicode 即涵蓋 UCS 合併後結果

關鍵認知修正

「Unicode 是編碼」❌ → 「Unicode 是編碼字元集」✅
「UTF-16 是字元集」❌ → 「UTF-16 是字元集編碼方案」✅

為何這區別至關重要?

  1. 編碼轉換本質 = **Code Point → 位元組序列** 的雙向映射
  2. 同一 Code Point 在不同 CES 產生不同位元組序列
  3. 亂碼本質 = 以錯誤 CES 解碼位元組序列,得到錯誤 Code Point
  4. 正確轉換流程:位元組 → (源 CES 解碼) → Code Point → (目標 CES 編碼) → 位元組

結語

建立「抽象字元集 → 編碼字元集 (Code Point) → 字元集編碼 (位元組)」三層心智模型,編碼轉換問題將迎刃而解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
編碼方案對應 CCS編碼規則「漢」(U+6C49) 結果特點
UTF-8Unicode變長 1-4 bytes,ASCII 兼容E6 B1 89 (3 bytes)網頁標準、節省空間
UTF-16UnicodeBMP 直接用 2 bytes,補充字元用 Surrogate Pair6C 49 (2 bytes)Java 內部、Windows API
UTF-32Unicode固定 4 bytes 直接存 Code Point00 00 6C 49 (4 bytes)處理簡單但浪費空間
GBKGBK 字元集雙位元組編碼BA BA (2 bytes)中文環境舊系統