有了區位碼為什麼還要有國標碼?

區位碼用數字對應了漢字,而機內碼是採用了ASCII碼不用的後128個字元(沒全用),那直接用區位碼轉換成機內碼不就好了,中間還要加個2020H的國標碼的出現是為了幹什麼?


沒人來回答我的問題。經過了幾天的查詢,以下是成果

GBK以及GBK2312 GB18030都是基與ASCII碼的字符集,也就是說,這種字符集,在你的電腦上是"吧拉吧拉吧拉"一串字,而在別人的電腦上卻是"啊呀啊呀啊呀"(不同字符集導致的)

這種基於ASCII的字符集有一個統一的缺點就是,世界上那麼多的語言它一個編碼會表示好多文字,在不同字符集代表的字元不同。unicode字符集不同,它每一個編碼就代表世界所有語言中的一個

下面來解釋我的問題

我們把常用的漢字列一個表,索引從1開始。

於是我們如果用第一個位元組表示行,第二個位元組表示列,這就叫做區位碼,第一個位元組稱為區碼,第二個位元組為位碼

但是我們發現這樣的話會我們吧ASCII碼原來所代表的東西都佔用了,不過我們的編碼里已經弄好了abcd...等等,所以我們只需要偏移開前面的控制字元部分就可以了.於是我們在區位碼的每一個位元組偏移了32個位置(前32個位置是控制字元,看起來就是加了2020H)這叫做國標碼/國際碼

好了,國標碼可以用了。。。但是我們發現這樣和ASCII碼的編碼方式相同,但是和ASCII碼不兼容,我們的字符集中的a和ASCII碼中的a並不是一個,這樣很不利於我們閱讀用ASCII碼來表示的文本。。。(這個還是非常多的)

於是我們乾脆來個更徹底的,直接把國標碼的每個位元組的首位置成1,(看起來就是加了8080H),這樣不就不會衝突了,ASCII碼可以直接拿來放到我們的字符集中正確顯示對應的字元了。

PS:關於這裡要說一下,細心的能夠發現其實在區位碼上直接加個8080H就不會衝突了。為什麼多餘了個2020H。這裡我沒有找到很官方的解釋,有一個比較合理的解釋是因為當時我們已經發布了我們的國標碼,這之後微軟的windows系統開始為了兼容中文,想做一個字符集並且和我們的國標碼兼容,他們並沒有關注其中怎麼實現(實現的方式太多了)。因為國標碼會和ASCII碼衝突,因此微軟在做字符集的時候直接把我們的國標碼的首位置成了1.這樣就一勞永逸了....這個就是GB2312,後來我們國家通過了這個標準,批准他可以使用了.後來因為國標碼收錄的字有點少,又弄了一個GBK,原理是一樣的。。


最近剛好學到這裡,答一下試試看吧。

ASCII碼中有32個控制字元,編碼值為0-31(十進位),它們並不表示任何一個可以列印或顯示的實際字元,只表示控制碼,如DLE(data link escape)數據鏈路轉義, CR (carriage return) 回車鍵等.這是英文字元編碼表.

中文的區位碼是為了表示中文的,另一個答案也說的很清楚了,為什麼區位碼變成國標碼時要加2020H?我想就算是中文的編碼表,同樣需要這32個控制字元,而為了和ASCII碼錶不衝突,乾脆就直接用這32個字元好了,所以在區碼的基礎上加上2020H,那麼相當於國標碼之中表示能列印和顯示的中文字元並不是從0開始的,而是從2020H開始的,2020H之前的編碼在國標碼之中和在ASCII碼之中的編碼就是一樣的,都表示控制字元,避免了重複定義這些控制字元引起的不必要的麻煩.


推薦閱讀:

如何申請斯坦福大學 機器學習專業 研究生或博士?
.net編程新手,就要去系統的學習了,如何能在課餘時間更好的學習?
學習腦科學、認知科學的相關知識對於普通人有哪些幫助?
去東京大學讀計算機研究生是個好選擇嗎?學界口碑如何?

TAG:計算機 | 編碼 | 資訊理論 | 編碼技術 | 編碼理論 |