【问题标题】:json_encode returns JSON_ERROR_UTF8 when converting array to JSON [closed]将数组转换为 JSON 时,json_encode 返回 JSON_ERROR_UTF8 [关闭]
【发布时间】:2014-08-31 11:22:21
【问题描述】:

我正在尝试将具有巴西葡萄牙语值的数组转换为 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:添加了一些代码以阐明示例,还添加了一些关于 cmets 中可能解决方案的说明。

【问题讨论】:

标签: php utf-8 character-encoding json


【解决方案1】:

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

你使用的是latin1作为显示编码,这样UTF-8编码,正确,文字显示不正确。

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

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

【讨论】:

    猜你喜欢
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多