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

2022-08-30 14:49:29

寻求

我希望获取具有重音字符的行。列 () 的编码为 。NAMElatin1_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 );

问题

Web 浏览器收到以下值:

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

而不是:

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

(或编码的等效项。

问题

文档指出适用于 UTF-8。我可以看到值从 LATIN1 编码为 UTF-8。但是,在调用 之后,值将变为 。json_encode()json_encode()null

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

一种可能的解决方案是使用Zend框架,但如果可以避免,我宁愿不要这样做。


答案 1
// 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);

答案 2
foreach( $row as $value ) {
  $value = utf8_encode( $value );

您实际上并没有将编码值写回数组中,只是更改了局部变量。如果要在更改变量时写回,则需要将其视为引用:$row$value

foreach( $row as &$value ) {

就个人而言,我会尽量避免引用,在这种情况下,我会使用Kemo发布的引用。array_map

或者使用 UTF-8 获取 UTF-8 中的返回值,而不考虑实际的表排序规则,这是将应用迁移到 UTF-8 的第一步。mysql_set_charset


推荐