UTF-8 character encoding battles json_encode()
探索
我在找有重音字符的行。列(
代码
下面的查询使用phpmyadmin返回
1 2 3 | SELECT C.NAME FROM CITY C WHERE C.REGION_ID=10 AND C.NAME_LOWERCASE LIKE '%abor%' ORDER BY C.NAME LIMIT 30 |
下面显示期望值(函数称为
1 2 3 4 5 6 7 8 9 | while( $row = mysql_fetch_assoc( $result ) ) { foreach( $row as $value ) { echo $value .""; $value = utf8_encode( $value ); echo $value .""; } $r[] = $row; } |
显示值:
然后使用
1 2 |
问题
Web浏览器接收以下值:
1 | {"ID":"5482","NAME":null} |
而不是:
1 | {"ID":"5482","NAME":"Abord a Plouffe"} |
(或编码的等价物。)
问题
文件指出,
如何使
一种可能的解决方案是使用Zend框架,但是如果可以避免的话,我宁愿不使用它。
1 2 3 4 5 6 7 8 9 10 | // Create an empty array for the encoded resultset $rows = array(); // Loop over the db resultset and put encoded values into $rows while($row = mysql_fetch_assoc($result)) { $rows[] = array_map('utf8_encode', $row); } // Output $rows echo json_encode($rows); |
1 2 |
实际上,您并没有将编码后的值写回其中的
1 | foreach( $row as &$value ) { |
就我个人而言,我会尽量避免引用,在这种情况下,使用Kemo发布的
或者
我的解决方案是在
似乎人们不应该把它放在查询中,而是应该放在:
1 |
在mysql connect语句之后。
在你的连接中:
例子:
1 2 3 4 5 | <?php $link = mysql_connect('localhost', 'your_user', 'your_password'); mysql_set_charset('utf8', $link); $db_selected = mysql_select_db('your_db', $link); ... |
希望能有所帮助。
在你得到你的结果之前,试一下
我有utf-8作为表编码和结果集编码,但有时人们仍然设法通过表单提交非utf-8字符,跟踪每个输入源很麻烦,所以我也包装了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | function safe_json_encode($mixed,$missing="TRANSLIT"){ $out=json_encode($mixed); if ($err= json_last_error()){ iconv_r("UTF-8","UTF-8//$missing",$mixed); $out=json_encode($mixed); } return $out; } function iconv_r($charset_i, $charset_o, &$mixed) { if (is_string($mixed)) { $mixed = iconv($charset_i, $charset_o, $mixed); } else { if (is_object($mixed)){ $mixed = (array) $mixed; } if (is_array($mixed)){ foreach ($mixed as $key => &$value) { iconv_r($charset_i, $charset_o, $value); } } } } |