将数组转换为 JSON 时,json_encode 返回 JSON_ERROR_UTF8 [关闭]
Posted
技术标签:
【中文标题】将数组转换为 JSON 时,json_encode 返回 JSON_ERROR_UTF8 [关闭]【英文标题】:json_encode returns JSON_ERROR_UTF8 when converting array to JSON [closed] 【发布时间】: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 中可能解决方案的说明。
【问题讨论】:
那么,值从何而来?您能否将其缩小到导致问题的一个特定值?缩小范围后,对该值执行bin2hex($value)
以查看其字节数。如果这些字节对于 UTF-8 对您期望的字符是正确的,请检查编码表。
这些值来自 mysql 查询,其中数据库和表字符集为 utf8,排序规则为 utf8_general_ci。具体问题似乎只发生在带有波浪号的人声中:en.wikipedia.org/wiki/Tilde(如我的问题中所示的示例)
试过***.com/questions/279170/utf-8-all-the-way-through?
Why does the PHP json_encode function convert UTF-8 strings to hexadecimal entities?的可能重复
绝对是***.com/questions/279170/utf-8-all-the-way-through的副本
【参考方案1】:
“如果我尝试使用 charset=utf8 或 charset=utf8mb4 连接到数据库,它会检索 Cartão(错误编码),而不是 Cartão(良好编码)”
你使用的是latin1作为显示编码,这样UTF-8编码,正确,文字显示不正确。
将charset=utf8
添加到连接字符串,并将响应字符集设置为UTF-8:
header('Content-Type: text/html;charset=utf-8');
【讨论】:
以上是关于将数组转换为 JSON 时,json_encode 返回 JSON_ERROR_UTF8 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章