新建表Clubs
CREATE TABLE `Clubs` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(30) CHARACTER SET utf8 NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
id name
1 程序員
2 架構師
3 產品經理
4 測試
如果在phpMyAdmin中查看name字段內容就是?,修改MySQL 字符集選擇UTF8,MySQL 連接校對選擇utf8_general_ci
在mysql中查看字段內容為正確的中文字符后,通過mysql_query('select * from clubs')查詢
用var_dump打印查詢結果如下,所有的中文漢字都變成了?
array (size=4) 0 => array (size=2) 'id' => string '1' (length=1) 'name' => string '???' (length=3) 1 => array (size=2) 'id' => string '2' (length=1) 'name' => string '???' (length=3) 2 => array (size=2) 'id' => string '3' (length=1) 'name' => string '????' (length=4) 3 => array (size=2) 'id' => string '4' (length=1) 'name' => string '??' (length=2)
解決辦法:在執行mysql_query之前先執行
mysql_query("set names utf8");
如果還不行,請確認php文件編碼格式是否是utf8格式,同時在php文件頭增加
header("Content-Type:text/html;charset=utf-8");
解決問題的根本辦法就是把相關的編碼格式都統一為utf8。
查詢結果中文字符沒問題了,但是$clubs轉化為json時,name字段中文字符卻又變了
$clubs=json_encode($clubs); echo($clubs);
輸出內容如下
[{"id":"1","name":"\u7a0b\u5e8f\u5458"},{"id":"2","name":"\u67b6\u6784\u5e08"},{"id":"3","name":"\u4ea7\u54c1\u7ecf\u7406"},{"id":"4","name":"\u6d4b\u8bd5"}]
解決方案:
foreach ( $clubs as $key => $value ) { foreach($value as $k=>$v){ $clubs[$key][$k] = urlencode($v); } } $clubs=json_encode($clubs); echo(urldecode($clubs));
原因:
json_encode只支持UTF8編碼的字符,使用JSON作為提交和接收的數據格式時,字符都采用UTF8編碼處理,當我們的頁面編碼和數據庫編碼不是采用UTF8的時候,就極容易出現中文亂碼的問題。解決辦法是在用js或者PHP處理JSON數據的時候都采用UTF8的形式。