Unicode:
unicode.org制定的編碼機制, 要將全世界常用文字都函括進去.
在1.0中是16位編碼, 由U+0000到U+FFFF. 每個2byte碼對應一個字元; 在2.0開始拋棄了16位限制, 原來的16位作為基本位平面, 另外增加了16個位平面, 相當於20位編碼, 編碼範圍0到0x10FFFF.
UCS:
ISO制定的ISO10646標準所定義的 Universal Character Set, 採用4byte編碼.
Unicode與UCS的關係:
ISO與unicode.org是兩個不同的組織, 因此最初制定了不同的標準; 但自從unicode2.0開始, unicode採用了與ISO 10646-1相同的字型檔和字碼, ISO也承諾ISO10646將不會給超出0x10FFFF的UCS-4編碼賦值, 使得兩者保持一致.
UCS的編碼方式:
UCS-2, 與unicode的2byte編碼基本一樣.
UCS-4, 4byte編碼, 目前是在UCS-2前加上2個全零的byte.UTF: Unicode/UCS Transformation Format
UTF-8, 8bit編碼, ASCII不作變換, 其他字元做變長編碼, 每個字元1-3 byte. 通常作為外碼. 有以下優點:
* 與CPU位元組順序無關, 可以在不同平台之間交流
* 容錯能力高, 任何一個位元組損壞後, 最多隻會導致一個編碼碼位損失, 不會鏈鎖錯誤(如GB碼錯一個位元組就會整行亂碼)
UTF-16, 16bit編碼, 是變長碼, 大致相當於20位編碼, 值在0到0x10FFFF之間, 基本上就是unicode編碼的實現. 它是變長碼, 與CPU字序有關, 但因為最省空間, 常作為網路傳輸的外碼.UTF-16是unicode的preferred encoding. 通常說的Unicode就是指UTF-16。
UTF-32, 僅使用了unicode範圍(0到0x10FFFF)的32位編碼, 相當於UCS-4的子集.UTF與unicode的關係:
Unicode是一個字元集, 可以看作為內碼.
而UTF是一種編碼方式, 它的出現是因為unicode不適宜在某些場合直接傳輸和處理. UTF-16直接就是unicode編碼, 沒有變換, 但它包含了0x00在編碼內, 頭256位元組碼的第一個byte都是0x00, 在作業系統(C語言)中有特殊意義, 會引起問題. 採用UTF-8編碼對unicode的直接編碼作些變換可以避免這問題, 並帶來一些優點. UTF-8以位元組為編碼單元,沒有位元組序的問題。UTF-16以兩個位元組為編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的位元組序。例如收到一個“奎”的Unicode編碼是594E,“乙”的Unicode編碼是4E59。如果我們收到UTF-16位元組流“594E”,那麼這是“奎”還是“乙”? Unicode規範中推薦的標記位元組順序的方法是BOM。
big endian和little endian
big endian和little endian是CPU處理多位元組數的不同方式。例如“漢”字的Unicode編碼是
6C49。那麼寫到檔案裡時,究竟是將6C寫在前面,還是將49寫在前面?如果將6C寫在前面,就
是big endian。還是將49寫在前面,就是little endian。
中文的編碼
從gb2312到gbk再到gb18030,其支援的漢字越來越多。GB2312、GBK到GB18030都屬於雙位元組字元集。從ASCII、GB2312、GBK到GB18030的編碼方法是向下相容的。