查閱以下幾種編碼
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出現亂碼應該首先想到是這問題。