UTF-8字符编码的战斗json_encode()

寻求

我正在寻找获取具有重音字符的行。 列( NAME )的编码是latin1_swedish_ci

代码

以下查询使用phpMyAdmin返回Abord â Plouffe

 SELECT C.NAME FROM CITY C WHERE C.REGION_ID=10 AND C.NAME_LOWERCASE LIKE '%abor%' ORDER BY C.NAME LIMIT 30 

以下显示期望值(函数称为db_fetch_all( $result ) ):

  while( $row = mysql_fetch_assoc( $result ) ) { foreach( $row as $value ) { echo $value . " "; $value = utf8_encode( $value ); echo $value . " "; } $r[] = $row; } 

显示的值: 5482 5482 Abord â Plouffe Abord â Plouffe

然后使用json_encode对数组进行编码:

 $rows = db_fetch_all( $result ); echo json_encode( $rows ); 

问题

网页浏览器收到以下值:

 {"ID":"5482","NAME":null} 

代替:

 {"ID":"5482","NAME":"Abord â Plouffe"} 

(或编码的等价物)

该文档指出, json_encode()在UTF-8上工作。 我可以看到从LATIN1到UTF-8编码的值。 然而,在对json_encode()的调用之后,该值变为null

如何使json_encode()正确地编码UTF-8值?

一个可能的解决scheme是使用Zend框架 ,但我宁愿不能,如果它可以避免。

 // 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); 
 foreach( $row as $value ) { $value = utf8_encode( $value ); 

你实际上并没有把你的编码值写回到$row数组中,而只是改变局部variables$value 。 如果您想在更改variables时回写,则需要将其作为参考:

 foreach( $row as &$value ) { 

就个人而言,我会尽可能地避免引用,对于这种情况,而不是使用由Kemo公布的array_map

或者使用UTF-8的mysql_set_charset来获取UTF-8的返回值,无论实际的表格整理如何,作为将应用迁移到UTF-8的第一步。

我的解决scheme是插入这行mysql_query('SET CHARACTER SET utf8'); ,在SELECT之前。 这个方法很好。

似乎不是在质疑中,而应该说:

 mysql_set_charset('utf8'); 

之后的mysql连接语句。

在你的连接中: mysql_set_charset('utf8', $link);

例:

 <?php $link = mysql_connect('localhost', 'your_user', 'your_password'); mysql_set_charset('utf8', $link); $db_selected = mysql_select_db('your_db', $link); ... 

希望有所帮助。

试试iconv_r($row,"LATIN1","UTF-8//TRANSLIT"); (函数如下)在json_encode()之前结果。

我有UTF-8作为表编码和结果集编码,但有时人们仍然设法通过窗体提交非UTF-8字符,并且追查每一个input源是很麻烦的,所以我还把json_encode()使它更安全。 尤其是在我看来,包含学位符号和英国民众似乎非常喜欢的“聪明语录”的空string。

 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); } } } }