曆史悠久的泱泱中華,文化博大精深,文字獨一無二,且能沒有一套屬于自己的計算機編碼。1980年,為了使每個漢字有一個全國統一的編碼,我國頒布了漢字編碼的國家标準:GB2312-80《信息交換用漢字編碼字符集》基本集,這個字符集是我國中文信息處理技術的發展基礎,也是國内所有漢字系統的統一标準。将一些常用符号及漢字,按區與位的方式編入碼表,這套編碼便是區位碼。
一、區位碼
區位碼是一個四位的十進制數,高兩位為區碼(01-94),低兩位為位碼(01-94),由此組成一個94×94的矩陣,每個碼值都對應着一個唯一的符号或漢字。如下圖示:
圖1. 第01區 特殊符号
圖2. 漢字區位碼對照表
說明:‘啊’的區位碼為1601,區碼為16,位碼為01。
圖3. 多音字‘腌’
說明:這種編碼經過加工整理一律以漢語拼音的字母為序, 音節相同的字以使用頻率為序,其查找方法與一般漢語字典的漢字拼音音節索引查找法相同。由于它是一種無重碼的漢字編碼,所以多音字隻有一個編碼。例如:重慶的“重”和重量的“重”,字同音不同,漢字“重”的編碼是按Zhong 音編碼。
由圖2,圖3所示,按拼音音節索引時,編碼并不連續,這是因為漢字被分級處理,一級漢字相對更為常用。如下圖示:
圖4. 區段說明
說明:在某些硬件指标相對偏低的平台上可能依然還在使用着一級碼漢字。
二、國标碼
漢字區位碼定義好後融入計算機,發現少了一些控制符,如回車,換行,退格等,同時ASCII編碼中前32個控制碼剛好包含了這些,那就借來用用吧!為此,國标碼誕生了。為了兼容這些控制碼,國标碼規定在區碼、位碼的基礎上分别加20H(即32的16進制數)。例如:漢字‘啊’的區位碼為1601,則區碼為16,位碼為01,轉換成16進制後,區碼為10H,位碼為01H,轉國标碼,則區碼10H 20H=30H,位碼01H 20H=21H,合成後國标碼為3021H;
圖5. 國标碼
說明:圖5為Mac系統中的16點陣中文國标碼點陣字庫,‘啊’的國标碼為3021H。
三、機内碼
這裡特指漢字機内碼,簡稱“内碼”,亦稱“變形國标碼”,指計算機内部存儲,處理加工和傳輸漢字時所用的由0和1符号組成的代碼。
國标碼雖說很好地解決了控制字符問題,但随着社會的發展,漢字處理系統想要兼容英文(當時主流就是ASCII),當系統中同時存在ASCII和漢字國标碼時,将會産生二義性。例如:有兩個字節的内容為30H和21H,它既可表示漢字“啊”的國标碼,又可表示ASCII中的“0”和“!”,為此,漢字機内碼誕生了。由于ASCII編碼範圍為00H~7FH,字節最高位皆為‘0’,機内碼應對國标碼加以适當變換處理,将相應國标碼每個字節的最高位置為“1”,即:漢字機内碼=漢字國标碼 8080H。例如:“啊”字的國标碼是3021H,則其漢字機内碼為B0A1H=3021H 8080H。
圖6. 機内碼
說明:圖6為按照Windows CP936(内碼)編碼生成的16Pixel中文點陣字庫,隻包含了一級碼漢字(3755個字符),‘啊’的編碼為:B0A1H。
上述所述,不論是區位碼,國标碼,還是機内碼,主要都是針對GB2312-80标準(7K 字符),若按區位碼94x94矩陣計算,最大也隻能表達94x94=8836個字符,這時有人可能會問,若要支持更多的中文怎麼辦呢?
這自然難不倒勤勞又機智的“中國人”。看懂下面這張圖,就都明白了。
說明:這裡主要記錄漢字編碼,并且第一字節最高位皆為‘1’,也能很好的做到向前兼容。
想要了解更多,推薦看看這篇文章:“國家标準代碼 - 百度百科”。
四、Unicode
Unicode 是為了解決傳統字符編碼方案的局限而産生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求,中文隻是其中的一部分。由于Unicode編碼(針對中文)不連續,隻能靠查表方式解決編碼轉換問題。
圖7. Unicode
說明:‘啊’的Unicode碼值為 554AH。
五、總結
區位碼、國标碼、機内碼之間遞進式轉換,都在這張表裡了。
随着社會發展不斷更新叠代,區位碼、國标碼在應用場景上已慢慢淡出了用戶視野,現在最常用的則是内碼,Unicode。
說了這麼多,想想,若沒有這些先輩們的堅持與努力,可能我們今天還在用ASCII計算機呢!
感恩所有為中文編碼默默奉獻的人!
參考文獻:
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!