官术网_书友最值得收藏!

1.3.1 ASCII到GBK

ASCII編碼

我們知道,二進制可用于表示不同數值,如果事先約定每一種數值對應的文字符號,就可以用來表示文本。

1874年,法國電報服務公司的職員埃米爾·波多(Emile Baudot)創造了一種5位編碼方式,又稱Baudot編碼。Baudot編碼整個系統由32個字符組成,編碼00被保留下來,字母占26個字符,剩余的5個字符是:回車、空格、換行、數字轉義、字符轉義,用來調整格式。

然而,5位編碼明顯不夠,數字和符號需要依賴轉義,大小寫字母也無法區分。這是當時經濟上的一種權衡技術。

實際上,英文大小寫加上10個數字,已經達到62個字符;如果考慮標點符號,字符數量會超過64個。因此,理想的編碼至少應為7位。

1967年,美國信息交換標準碼(American Stardard Code for Information Interchange,ASCII)正式發布,采用7位編碼,取值范圍是0~127,即00h~7Fh。

可以在線查看完整的ASCII編碼表。對于像Hello,World!這樣的一段文本,它的ASCII碼為:

48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21

字符和字節是一一對應的。00通常保留為空字符,代表一個字符串的結束。0x20代表空格。大小寫字母之間的差值也為0x20。

128個碼位包括大寫字母26個、小寫字母26個、數字10個、控制符33個、符號33個。

區位碼

ASCII碼只有128個碼位,而常用的漢字有6000多個,這顯然是不夠的。

為了解決這個問題,在20世紀80年代,國際標準化組織(ISO)及國際電工委員會(IEC)聯合制定了ISO/IEC 8859,簡稱ISO 8859。DOS時代的漢字系統和漢字輸入法就建立在ISO 8859之上。

同時,為了解決漢字的計算機編碼問題,我國也制定了對應的國家標準,即國標第2312號,簡稱GB 2312。由于該標準于1980年發布,也叫作GB 2312—1980,這個標準能編碼6763個簡體漢字。

GB 2312的基礎,是漢字的區位碼,分為94個區,每個區都保留96個碼位,頭尾2個碼位被保留為空,剩余94個碼位用于表示漢字字符。這樣共有94×94=8836個可用碼位,但GB 2312實際使用了其中的7445個,還有一些空區/空碼。

例如,“啊”字的區位碼是1601,表示第16區的第1個字符。“誠”字的區位碼是1947,表示第19區的第47個字符。

區位碼使用十進制表示,而GB 2312則使用十六進制表示,范圍是0xA1A1~10xFEFE。這里從0xA1到0xFE正好是94個區/碼,如圖1-10所示。選擇從0xA1(161)開始是為了與ASCII碼(0~127)兼容,同時保持一定的后續擴展能力。

img

圖1-10 GB 2312中的漢字

圖1-11中的算法實現了區位碼和GB 2312的相互轉換。

img

圖1-11 區位碼和GB 2312的相互轉換

要將區位碼轉換成GB 2312,只需要將高、低字節分別加上0xA0,反之減去0xA0即可。

img

GB 2312

GB 2312編碼了7445個字符、94個區,漢字在16~55區和56~87區,如圖1-12所示。

img

圖1-12 GB 2312符號表

漢字共有6763個,其中包含一級字庫3755個和二級字庫3008個。非漢字符號有682個,包括符號202個、序號60個、數字22個、拉丁符號52個、日文符號169個、希臘符號48個、俄文符號66個、拼音符號26個、注音符號37個。

這個標準于1981年5月實施,是DOS時代使用的漢字編碼標準。

GBK編碼

隨著計算機的普及,人們對各種字符的需求不斷增加。因此,1995年12月,GB的擴展標準GBK得以推出。

GBK可以表示21 886個字符,分為5部分。GBK1、GBK2與GB 2312兼容,并新增717個字符。GBK3新增6080個漢字,GBK4新增8160個漢字,GBK5新增166個符號,如圖1-13所示。

img

圖1-13 GBK符號表

GBK編碼表示一個字符,可以分為1、2、4字節。

·如果首字節在0x00~0x7F,則這段編碼與ASCII編碼一致。

·如果首字節為0x80或0xFF,則為無效編碼。

·如果首字節在0x81~0xFE,且第二字節在0x40~0xFE,則為兩字節編碼。

·如果首字節在0x81~0xFE,且第二字節在0x30~0x39,則為四字節編碼,其第三、四字節重復第一、二字節的模式,其余為無效字節。

根據以上規則,可以編寫一個函數,用于獲取一個GBK字節流中的字符數[14]

GBK標準是為了使計算機能夠兼容漢字而開發的。隨著計算機在世界范圍內的普及,國際上越來越希望有一種統一的文字編碼,能夠兼容全球所有的文字,這就是Unicode編碼。下一節我們將詳細介紹Unicode編碼。

主站蜘蛛池模板: 江北区| 陇南市| 扎兰屯市| 通辽市| 伊川县| 弥渡县| 任丘市| 襄汾县| 海兴县| 晋江市| 康马县| 读书| 津南区| 柏乡县| 万全县| 黔南| 玉田县| 仁怀市| 曲松县| 治县。| 辉南县| 岢岚县| 顺平县| 安远县| 陵水| 郸城县| 鹿泉市| 鹰潭市| 达尔| 孟津县| 新宁县| 理塘县| 伊吾县| 阳城县| 衡东县| 岳普湖县| 松江区| 朝阳区| 江源县| 嵊州市| 资兴市|