取得網頁文本后顯示時,經常出現亂碼的現象,這就需要把不同編碼之間進行轉換,了解不同漢字編碼的區別才好進行轉換呀。。。
本文中先介紹一下ASCII,GB2312,GBK和GB18030編碼。
之所以把這幾個放在一起介紹,是因為他們的相關性非常強。兼容性關系是GB18030兼容GBK,GBK兼容GB2312,GB2312兼容ASCII。所謂兼容,你可以簡單理解為子集、不沖突的關系。例如GB2312編碼的文件中可以出現ASCII字符,GBK編碼的文件中可以出現GB2312和ASCII字符,GB18030編碼的文件可以出現GBK、GB2312、ASCII字符。
每種編碼方式的特點:
【1】ASCII 每個字符占據1bytes,用二進制表示的話最高位必須為0(擴展的ASCII不在考慮范圍內),因此ASCII只能表示128個字
【2】GB2312 最早一版的中文編碼,每個字占據2bytes。由於要和ASCII兼容,那這2bytes最高位不可以為0了(否則和ASCII會有沖突)。在GB2312中收錄了6763個漢字以及682個特殊符號,已經囊括了生活中最常用的所有漢字。
【3】GBK 由於GB2312只有6763個漢字,我漢語博大精深,只有6763個字怎么夠?於是GBK中在保證不和GB2312、ASCII沖突(即兼容GB2312和ASCII)的前提下,也用每個字占據2bytes的方式又編碼了許多漢字。經過GBK編碼后,可以表示的漢字達到了20902個,另有984個漢語標點符號、部首等。值得注意的是這20902個漢字還包含了繁體字。
【4】GB18030 然而,GBK的兩萬多字也已經無法滿足我們的需求了,還有更多可能你自己從來沒見過的漢字需要編碼。這時候顯然只用2bytes表示一個字已經不夠用了(2bytes最多只有65536種組合,然而為了和ASCII兼容,最高位不能為0就已經直接淘汰了一半的組合,只剩下3萬多種組合無法滿足全部漢字要求)。因此GB18030多出來的漢字使用4bytes編碼。當然,為了兼容GBK,這個四字節的前兩位顯然不能與GBK沖突(實操中發現后兩位也並沒有和GBK沖突)。我國在2000年和2005年分別頒布的兩次GB18030編碼,其中2005年的是在2000年基礎上進一步補充。至此,GB18030編碼的中文文件已經有七萬多個漢字了,甚至包含了少數民族文字。
這圖中展示了前文所述的幾種編碼在編碼完成后,前2個byte的值的范圍(用16進制表示)。每個byte可以表示00到FF(即0至255)。從圖中我們可以一目了然地看到為什么GB18030可以兼容GBK,GB2312和ASCII了。他們幾種編碼之間前兩位沒有重合部分。需要注意的是ASCII只有1byte,所以是沒有第二位的。另外GB18030在上圖中占的面積雖然很小,但是它是4bytes編碼,這圖只展示了前兩位。如果后兩位也算上,GB18030的字數要遠多於GBK。另外需要注意的是,由於GBK兼容GB2312,因此屬於GB2312的藍色區域其實也可以算作是GBK的區域。同理GBK的區域理論上也屬於GB18030的區域。上表中只是展示了多出來的部分。
實際生活中,我們用到的99%以上的漢字,其實都在GB2312那一塊區域內。在實際使用中,GBK編碼已經可以滿足大部分場景了,GB18030編碼中所有漢字都是我們這輩子都不一定能見到的文字,這也是平時為什么經常會使用GBK的原因吧。