儘量不要使用gb2312避免亂碼

查閱以下幾種編碼

 

 

GB2312
雙字節,定長
包括一二級漢字和9區符號
高位低位一樣,都是從0xA1~0xFE
漢字編碼範圍是0xB0A1~0xF7FE

 

GBK
雙字節,定長
兼容GB2312
編碼範圍:0x8140~0xFEFE
所有字符都可以映射到Unicode2.0

 

GB18030-2000(GBK2K)
收藏少數民族字型
不定長,包含二字節部分和四字節部分
二字節部分兼容GBK
四字節部分是擴充字符,第一第三字節範圍:0x81~0xFE,第二第四字節範圍:0x30~0x39

 

Unicode
包括所有字符字型
各地區語言都可與之建立映射
異種語言的轉換是通過Unicode來完成的
漢字從4E00開始

 

其中gb2312編碼所表示的字符最少,這樣其實會引起很多問題,其中有些可能你看不懂的亂碼問題也是因爲這原因而起的。

這裏舉個例子:

"和珅"這兩個字中的"珅"字簡體字和繁體字是一樣的,但在gb2312編碼裏是沒有的。這樣在使用gb2312編碼的頁面裏就會出問題了,可能你在頁面中輸入是正確的但傳輸到了服務器端就會亂碼,而且他可能會影響下面的字也出現亂碼(字節碼組合問題)。

 

測試一下語句

<?php

echo iconv('UTF-8', 'gb2312//IGNORE', iconv('gb2312', 'UTF-8', '珅字出現亂碼')).'<br />';

echo mb_convert_encoding(mb_convert_encoding('珅字出現亂碼', 'UTF-8', 'gb2312'), 'gb2312', 'UTF-8').'<br/>';

echo mb_convert_encoding(mb_convert_encoding('珅字出現亂碼', 'UTF-8', 'gbk'), 'gbk', 'UTF-8').'<br />';

echo iconv('UTF-8', 'gbk', iconv('gbk', 'UTF-8', '珅字出現亂碼')).'<br />';

?>

結果:

 


?字出現亂碼
珅字出現亂碼
珅字出現亂碼

 

第一行沒有輸出

第二行出現亂碼

第三行由於使用gbk編碼顯示正常

第四行也由於使用gbk編碼顯示正常

 

而gbk兼容GB2312而且可以在gb2312編碼的頁面中正常顯示。在使用gb2312編碼的頁面使用gbk編碼,可以避免不必要的麻煩。如果一定要用gb2312編碼可以在前臺顯示頁面使用gb2312編碼,而後臺數據庫和服務器端使用gbk編碼。

 

另:網上所說的iconv在utf-8轉gb2312會出現亂碼的問題,有的說是bug。其實這不是bug,也是這個問題。utf-8表示的字在gb2312裏沒有,當然要亂碼了。因此當你發現gb2312出現亂碼應該首先想到是這問題。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章