1. 程式人生 > >[學習筆記] 五分鐘快速理解字符集與字元編碼的區別

[學習筆記] 五分鐘快速理解字符集與字元編碼的區別

字符集

字符集,也稱作字元編碼方案,是為字元集合中每一個字元分配一個唯一ID的編碼字符集.包括了Unicode,ASCII,ANSI等字符集。

Unicode字符集所有字元組成的字符集
國際組織制定的可以容納世界上所有文字和符號的字元編碼方案。如果全世界每一個符號都給予一個獨一無二的編碼,那麼亂碼問題就會消失。這就是Unicode,就像它的名字都表示的,這是一種所有符號的編碼。

ASCII字符集西文字符集
美國國家標準學會(American National Standard Institute , ANSI )制定的,標準的單位元組字元編碼方案,用8位表示256種可能的字元,包含所有的大小寫字母,數字0~9,標點符號與特殊控制符號。

ANSI字符集西文字元+不同語言文字的字符集
為使計算機支援更多語言,使用1 個位元組來表示 1 個英文字元(標準的ASCII字符集)。超出此範圍的語言文字使用0x80~0xFFFF來編碼,即擴充套件的ASCII編碼。不同的國家和地區制定了不同的標準,由此產生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的編碼方案/標準。
例如:
GBK、GB2312簡體字符集
Big5繁體字符集
GB18030漢字、日文假名、朝鮮語和中國少數民族文字大字符集
Shift_JIS日語字符集

字元編碼

字元編碼是字符集的編碼實現或者編碼規則,每個已經編好碼的字元對應到字符集的一個獨立的位置上.
分為定長編碼

可變長編碼(節約編碼).
編碼形式有單位元組編碼,雙位元組編碼,混合位元組編碼等.(1byte=8bit)
例如:
字元A用ASCII單位元組定長編碼0100 0001,
但是漢字數量超出了ASCII編碼範圍(最多28=256個字元),
所以用Unicode編碼(最多216=65536個字元),表示原本無法表示的漢字,
例如字元’知’用Unicode雙位元組定長編碼0111 0111 1110 0101,字元A表示為0000 0000 0100 0001
但是,原本可以用一個位元組儲存的英文字母,現在變成兩個位元組,如果文件的英文字母很多的話就產生了浪費.
所以產生了避免浪費的可變長混合編碼方式:UTF-8,規則是:英文字母編碼為1個位元組,漢字字元則是3個位元組(詳細請參考相關文件)

常見字元編碼
基於Unicode字符集的字元編碼:Unicode,UTF-8,UTF-16,UTF-32
基於ASCII字符集的字元編碼:ASCII
基於ANSI字符集的字元編碼:GB2312、GBK、GB18030、Big5、Shift_JIS

容易混淆的概念

Q: 為什麼Unicode在概念上既是字符集又是字元編碼?
A: 實際上Unicode=Unicode字符集+Unicode(定長編碼)+UTF-8,UTF-16等字元編碼的總稱
Unicode編碼是Unicode字符集的完整實現,即用兩個位元組表示字符集中的一個獨立字元,而UTF-8是Unicode字符集的可變長編碼的實現. 所以Unicode,ANSI,ASCII都是廣義表示,必須加上字符集或者編碼規則來區分概念.

Q: 可以用例項說明一下Unicode編碼和UTF-8編碼的區別嗎?
A: 假如記事本輸入中包含以下資訊:
在這裡插入圖片描述
儲存時,選擇儲存為Unicode和UTF-8兩個文字
在這裡插入圖片描述
檢視檔案大小,就可以發現Unicode編碼的大小比UTF-8編碼大了13位元組,這是因為
Unicode: 10x2(數字)+7x2(字母)+3x2(漢字)+1x2(不可見的回車符)=42位元組
UTF-8: 10x1(數字)+7x1(字母)+3x3(漢字)+1x3(不可見的回車符)=29位元組
Unicode
UTF-8