将数组转换为JSON时,json_encode返回JSON_ERROR_UTF8

时间:2014-07-10 07:14:01

标签: php utf-8 character-encoding json

我正在尝试将具有巴西葡萄牙语值的数组转换为JSON。

这是一个数组示例:

array(1) {
  ["title"]=>
  string(77) "Cartão Credicard Universitário Visa Crédito "
}

如果我使用mb_detect_encoding,则表明所有值和键都是ASCII或UTF8。

但是,如果我尝试使用json_encode来生成json,则会返回false并且json_last_error函数表示错误为JSON_ERROR_UTF8

但是如果我首先将utf8_encode_deep函数应用于数组(http://php.net/manual/es/function.utf8-encode.php),则会生成json而不会出现任何错误。

这个解决方案的问题在于它返回了编码错误的某些单词。

示例:

在申请utf8_encode之前的词:Cartão(良好的编纂)

应用utf8_encode后的单词:Cartão(编码错误)

因此虽然它生成了JSON,但它并没有解决我的问题,因为它弄乱了单词。

以下是我正在使用的代码:

try {
  $dbh = new PDO("mysql:host=$hostname;dbname=$database;", $username, $password);
  $sql = "SELECT title FROM card";
  $stmt = $dbh->query($sql);

  $result = $stmt->fetch(PDO::FETCH_ASSOC);
  $json = $json_encode($result);
  $error = json_last_error();

  var_dump($json, $error === JSON_ERROR_UTF8);
} catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage() . '\n';
}

如果我尝试使用charset = utf8或charset = utf8mb4连接到数据库,它会检索Cartão(编码错误),而不是Cartão(编码良好)

我还尝试使用JSON_UNESCAPED_UNICODE作为json_encode的参数,但结果与不使用此参数的结果相同。

有什么建议吗?

更新:我已经通过一个具体案例简化了这个问题。

更新2 :添加了一些代码以澄清示例,还在评论中添加了一些关于可能解决方案的解释。

1 个答案:

答案 0 :(得分:3)

  

“如果我尝试使用charset = utf8或charset = utf8mb4连接到数据库,它会检索Cartão(编码错误),而不是Cartão(良好的编码)”

您正在使用latin1作为显示编码,因此UTF-8编码的正确文本显示不正确。

charset=utf8添加到连接字符串,并将响应字符集设置为UTF-8:

header('Content-Type: text/html;charset=utf-8');