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