- RTC程序設計:實時音視頻權威指南
- 戴維
- 1495字
- 2024-05-14 10:03:25
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)兼容,同時保持一定的后續擴展能力。

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

圖1-11 區位碼和GB 2312的相互轉換
要將區位碼轉換成GB 2312,只需要將高、低字節分別加上0xA0,反之減去0xA0即可。

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

圖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所示。

圖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編碼。
- Cocos2d Cross-Platform Game Development Cookbook(Second Edition)
- UNIX編程藝術
- Objective-C應用開發全程實錄
- 算法零基礎一本通(Python版)
- Rust編程:入門、實戰與進階
- Oracle數據庫從入門到運維實戰
- Working with Odoo
- 單片機C語言程序設計實訓100例
- 西門子S7-200 SMART PLC編程從入門到實踐
- 計算機應用基礎案例教程
- Unity 3D腳本編程:使用C#語言開發跨平臺游戲
- Instant Debian:Build a Web Server
- Node.js 12實戰
- ASP.NET 4.0 Web程序設計
- Greenplum構建實時數據倉庫實踐