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