全球化編碼
阿新 • • 發佈:2017-05-11
函數 標準 一個 中國 兼容性 ascii 如果 方式 不同的
從C\C++\開始學編程的兄弟們肯定對char這個基本類型有深刻的理解。什麽\0最為結束符,strlen和sizeof,字符串數組和char*的字符串,這部分基本上是學習C語言最先要面對的一個攔路虎。當然學習java、C#這些相對沒有歷史包袱的語言的時候,就不會感到這麽坑爹了。
實際上,對不起各位的是,char這個類型作為描述字符的載體,還有著其他的問題。我們在下面簡單說一些。(僅作為拋磚引玉,如果有什麽缺陷,希望大家不吝賜教)
- 對於老美來說,char很完美。從char這個類型來說,在C\C++的標準中,它占用8位,也就是最多支持256個字符,除去一個結束符,最多也就支持255個。C\C++這群人在一開始的時候,255個足夠老美用了,就愉快的決定義了字符和一些制表符在char裏面的表現方式。這就是ASCII。這裏我多說一句,ASCII是一種編碼格式,他表示的是一個碼表(code set)在計算機裏面的表現方法。我們要區分清楚碼表和編碼這兩者的區別。
- 對象形語系來說,char不夠用。當C\C++出海了之後,到了亞洲國家,人們就發現用char表示這麽多漢字,根本就是強人所難。所以當時主要是中國、日本、韓國,各自定義了自己的碼表和編碼,基本上都是用更多的char來表示更多的字。比如說“啊”,在GB2312中,就用0xB0(第一個字節) 0xA1(第二個字節)儲存。並且前0x00~0xFF與ASCII兼容。
- 對於不同的拉丁語系來說,char也很蛋疼。對於有重音的拉丁語系,例如à,它就需要占用ASCII表中128--255的部分。那麽同樣的是char,同樣的值,對應不同的拉丁語碼表的時候,可能就會出現不同的結果。
- 對於象形語系來說,更加蛋疼。比如中國的“啊”再GB2312下是0xB0、0xA1,那麽到了GBK下面,可能就是其他的字,因為GBK和GB2312的碼表和編碼都不一樣。
後來,大家發現了這個問題,對於一個程序,想要全球發布,就會面臨很大的問題。所以後來人們就發明了另外一種碼表-Unicode。顧名思義,Unicode是把世界上所有的字符,都包含進來的一個超級大的碼表。Unicode的基本思想就是,我的表裏面什麽都有,無論在任何語言的任何系統,只要支持Unicode,就能在表裏面找到想要的字符。當前Unicode使用的是UCS-2(16位的),可以容納65535個字符,基本上也夠用了。編碼方式有utf-16、utf-32、utf-8。因為utf-8對之前的一些字符串函數兼容性更好,所以現在廣泛使用的就是utf-8。
好了,到現在為止,我們一共提出了ASCII、亞洲的多字符編碼、Unicode三種大的編碼方式。那我們要怎麽選擇,以及他們相互之間要怎麽切換哪?等我有時間再說。
全球化編碼