基本概念
● 字符(Character) 是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。
● 字符集(Character set) 是一個系統支持的所有抽象字符的集合。通常以二維表的形式存在,二維表的內容和大小是由使用者的語言而定。如ASCII,GBxxx,Unicode等。
● 字符編碼(Character encoding) 是把字符集中的字符編碼為特定的二進制數,以便在計算機中存儲。每個字符集中的字符都對應一個唯一的二進制編碼。
字符集和字符編碼一般都是成對出現的,如ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了對應的字符編碼。Unicode比較特殊,有多種字符編碼(UTF-8,UTF-16等)
常見字符集及編碼
1. ASCII字符集&編碼
ASCII(American Standard Code for Information Interchange, 美國信息交換標準代碼)是基于拉丁字母的一套電腦編碼系統。它主要用于顯示現代英語,而其擴展版本EASCII則可以部分支持其他西歐語言,并等同于國際標準ISO/IEC 646。
字符集范圍
ASCII一共定義了128個字符,包括33個控制字符,和95個可顯示字符。大部分的控制字符已經被廢棄。
編碼格式
ASCII碼為單字節,用7位二進制數表示,由于計算機1個字節是8位二進制數,所以最高位為0,即00000000-01111111或0x00-0x7F。
Unicode,GBXXX,UTF-8等字符編碼都兼容ASCII編碼。
EASCII(Extended ASCII,延伸美國標準信息交換碼)是將ASCII碼由7位擴充為8位而成。EASCII的內碼是由0到255共有256個字符組成。EASCII碼比ASCII碼擴充出來的符號包括表格符號、計算符號、希臘字母和特殊的拉丁符號。
2. GB2312字符集&編碼
GB2312 或 GB2312–80 是中華人民共和國國家標準簡體中文字符集,全稱《信息交換用漢字編碼字符集·基本集》,又稱GB0,由中國國家標準總局發布,1981年5月1日實施。GB2312編碼通行于中國大陸;新加坡等地也采用此編碼。中國大陸幾乎所有的中文系統和國際化的軟件都支持GB2312。
字符集范圍
GB2312標準共收錄6763個漢字,其中一級漢字3755個,二級漢字3008個;同時收錄了包括拉丁字母、希臘字母、日文平假名及片假名字母、俄語西里爾字母在內的682個字符。
GB2312的出現,基本滿足了漢字的計算機處理需要,它所收錄的漢字已經覆蓋中國大陸99.75%的使用頻率。但對于人名、古漢語等方面出現的罕用字和繁體字,GB2312不能處理,因此后來GBK及GB18030漢字字符集相繼出現以解決這些問題。
分區
GB2312中對所收漢字進行了“分區”處理,每區含有94個漢字/符號。這種表示方式也稱為區位碼。
● 01–09區為特殊符號。
● 16–55區為一級漢字,按拼音排序。
● 56–87區為二級漢字,按部首/筆畫排序。
舉例來說,“啊”字是GB2312之中的第一個漢字,它的區位碼就是1601。
10–15區及88–94區則未有編碼。
編碼格式
在使用GB2312的程序通常采用EUC儲存方法,以便兼容于ASCII。
每個漢字及符號以兩個字節來表示。第一個字節稱為“高位字節”,第二個字節稱為“低位字節”。
“高位字節”使用了0xA1–0xF7(把01–87區的區號加上0xA0),“低位字節”使用了0xA1–0xFE(把01–94加上0xA0)。 由于一級漢字從16區起始,漢字區的“高位字節”的范圍是0xB0–0xF7,“低位字節”的范圍是0xA1–0xFE,占用的碼位是72*94=6768。其中有5個空位是D7FA–D7FE。
3. GBK字符集&編碼
漢字內碼擴展規范,稱GBK,全名為《漢字內碼擴展規范(GBK)》1.0版,由中華人民共和國全國信息技術標準化技術委員會1995年12月1日制訂,國家技術監督局標準化司和電子工業部科技與質量監督司1995年12月15日聯合以《技術標函[1995]229號》文件的形式公布。
GBK的K為漢語拼音Kuo Zhan(擴展)中“擴”字的聲母。英文全稱Chinese Internal Code Extension Specification。
字符集
GB2312-80只收錄6763個漢字,有不少漢字,如部分在GB2312-80推出以后才簡化的漢字(如“啰”),部分人名用字(如中國前總理朱镕的“镕”字),臺灣及香港使用的繁體字,日語及朝鮮語漢字等,并未有收錄在內。GBK對GB2312-80進行擴展, 總計擁有 23940 個碼位,共收入21886個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號883 個。
編碼格式
GBK 亦采用雙字節表示,總體編碼范圍為8140-FEFE,首字節在81-FE 之間,尾字節在40-FE 之間,剔除 xx7F一條線。
GBK向下完全兼容GB2312-80編碼。支持GB2312-80編碼不支持的部分中文姓,中文繁體,日文假名,還包括希臘字母以及俄語字母等字母。不過這種編碼不支持韓國字,也是其在實際使用中與unicode編碼相比欠缺的部分。
4. GB18030字符集&編碼
GB18030,全稱:國家標準GB18030-2005《信息技術 中文編碼字符集》,是中華人民共和國現時最新的內碼字集,是GB18030-2000《信息技術 信息交換用漢字編碼字符集 基本集的擴充》的修訂版。與GB2312-1980完全兼容,與GBK基本兼容;支持GB 13000(93版等同于Unicode 1.1;2010版等同于Unicode 4.0)及Unicode的全部統一漢字,共收錄漢字70,244個。
本規格的初版是由中華人民共和國信息產業部電子工業標準化研究所起草,由國家質量技術監督局于2000年3月17日發布?,F行版本為國家質量監督檢驗總局和中國國家標準化管理委員會于2005年11月8日發布,2006年5月1日實施。
此標準內的單字節編碼部分、雙字節編碼部分,和四字節編碼部分收錄的中日韓統一表意文字擴展A區漢字,為強制性標準。其他部分則屬于規模性標準。在中華人民共和國境內所有軟件產品,都需要支持這個同時包含單字節、雙字節和四字節編碼的規格。
GB18030主要有以下特點:
● 和UTF-8一樣都采用多字節編碼,每個字可以由1個、2個或4個字節組成。
● 編碼空間龐大,最多可定義161萬個字元。
● 支持中國國內少數民族的文字,不需要動用造字區。
● 漢字收錄范圍包含繁體漢字以及日韓漢字。
編碼方式
● 單字節,其值從0x00到0x7F。
● 雙字節,第一個字節的值從0x81到0xFE,第二個字節的值從0x40到0xFE(不包括0x7F)。
● 四字節,第一個字節的值從0x81到0xFE,第二個字節的值從0x30到0x39,第三個字節從0x81到0xFE,第四個字節從0x30到0x39。
5.Unicode字符集&編碼
Unicode(中文:萬國碼、國際碼、統一碼、單一碼)是計算機科學領域里的一項業界標準。它對世界上大部分的文字系統進行了整理、編碼,使得電腦可以用更為簡單的方式來呈現和處理文字。
Unicode伴隨著通用字符集的標準而發展,同時也以書本的形式對外發表。Unicode至今仍在不斷增修,每個新版本都加入更多新的字符。目前最新的版本為2016年6月21日公布的9.0.0,已經收入超過十萬個字符(第十萬個字符在2005年獲采納)。Unicode涵蓋的數據除了視覺上的字形、編碼方法、標準的字符編碼外,還包含了字符特性,如大小寫字母。
Unicode發展由非營利機構統一碼聯盟負責,該機構致力于讓Unicode方案替換既有的字符編碼方案。因為既有的方案往往空間非常有限,亦不適用于多語環境。
Unicode備受認可,并廣泛地應用于電腦軟件的國際化與本地化過程。有很多新科技,如可擴展置標語言、Java編程語言以及現代的操作系統,都采用Unicode編碼。
編碼方式
統一碼的編碼方式與ISO10646的通用字符集概念相對應。目前實際應用的統一碼版本對應于UCS-2,使用16位的編碼空間。也就是每個字符占用2個字節。這樣理論上一共最多可以表示2的16次方(即65536)個字符?;緷M足各種語言的使用。實際上當前版本的統一碼并未完全使用這16位編碼,而是保留了大量空間以作為特殊使用或將來擴展。
Unicode原編碼占用兩個字節,在使用ASCII字符時,高位字節的8位始終為0,這會造成空間的浪費。為了避免這種浪費,Unicode的實現方式不同于編碼方式。一個字符的Unicode編碼是確定的。但是在實際傳輸過程中,由于不同系統平臺的設計不一定一致,以及出于節省空間的目的,對Unicode編碼的實現方式有所不同。Unicode的實現方式稱為Unicode轉換格式(Unicode Transformation Format,簡稱為UTF)。
UTF-8、UTF-16、UTF-32都是將數字轉換到程序數據的編碼方案。
6. UTF-8 編碼
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,也是一種前綴碼。其編碼中的第一個字節仍與ASCII兼容,這使得原來處理ASCII字符的軟件無須或只須做少部分修改,即可繼續使用。
UTF-8使用一至六個字節為每個字符編碼(盡管如此,2003年11月UTF-8被RFC3629重新規范,只能使用原來Unicode定義的區域,U+0000到U+10FFFF,也就是說最多四個字節):
1、128個US-ASCII字符只需一個字節編碼(Unicode范圍由U+0000至U+007F)。
2、帶有附加符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及它拿字母則需要兩個字節編碼(Unicode范圍由U+0080至U+07FF)。
3、其他基本多文種平面(BMP)中的字符(這包含了大部分常用字,如大部分的漢字)使用三個字節編碼(Unicode范圍由U+0800至U+FFFF)。
4、其他極少使用的Unicode 輔助平面的字符使用四至六字節編碼(Unicode范圍由U+10000至U+1FFFFF使用四字節,Unicode范圍由U+200000至U+3FFFFFF使用五字節,Unicode范圍由U+4000000至U+7FFFFFFF使用六字節)。
對上述提及的第四種字符而言,UTF-8使用四至六個字節來編碼似乎太耗費資源了。但UTF-8對所有常用的字符都可以用三個字節表示,而且它的另一種選擇,UTF-16編碼,對前述的第四種字符同樣需要四個字節來編碼,所以要決定UTF-8或UTF-16哪種編碼比較有效率,還要視所使用的字符的分布范圍而定。
編碼方式
● 單字節字符的最高有效比特永遠為0。
● 多字節序列中的首個字符組的幾個最高有效比特決定了序列的長度。最高有效位為110的是2字節序列,而1110的是三字節序列,以此類推。
● 多字節序列中其余的字節中的首兩個最高有效比特為10。