Php 将数组转换为json时,json_encode返回json_错误\u UTF8
我正在尝试将一个带有巴西葡萄牙语值的数组转换为JSON 下面是一个数组示例:Php 将数组转换为json时,json_encode返回json_错误\u UTF8,php,utf-8,character-encoding,json,Php,Utf 8,Character Encoding,Json,我正在尝试将一个带有巴西葡萄牙语值的数组转换为JSON 下面是一个数组示例: array(1) { ["title"]=> string(77) "Cartão Credicard Universitário Visa Crédito " } 如果我使用mb_detect_编码,它会显示所有值和键都是ASCII或UTF8格式 但是,如果我尝试使用json_encode来生成json,它将返回一个false,json_last_error函数表示错误为json_error_UTF8
array(1) {
["title"]=>
string(77) "Cartão Credicard Universitário Visa Crédito "
}
如果我使用mb_detect_编码,它会显示所有值和键都是ASCII或UTF8格式
但是,如果我尝试使用json_encode来生成json,它将返回一个false,json_last_error函数表示错误为json_error_UTF8
但是如果我首先将utf8_encode_deep函数应用于数组,则生成json时不会给出任何错误
此解决方案的问题在于,它返回某些编码错误的单词
例如:
应用utf8_编码前的单词:Cartão良好编码
应用utf8_编码后的单词: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Ãobad编目,而不是Cartão good编目
我还尝试使用JSON_UNESCAPED_UNICODE作为JSON_encode的参数,但结果与不使用此参数时相同
有什么建议吗
更新:我已经用一个具体的例子简化了这个例子,这个问题正在发生
更新2:添加了一些代码以澄清示例,并在注释中添加了一些关于可能解决方案的解释
如果我尝试使用charset=utf8或charset=utf8mb4连接到数据库,它将检索CartÃobad编目,而不是Cartão good编目
您使用拉丁1作为显示编码,因此UTF-8编码的正确文本显示不正确
将charset=utf8添加到连接字符串,并将响应字符集设置为UTF-8:
header('Content-Type: text/html;charset=utf-8');
如果我尝试使用charset=utf8或charset=utf8mb4连接到数据库,它将检索CartÃobad编目,而不是Cartão good编目
您使用拉丁1作为显示编码,因此UTF-8编码的正确文本显示不正确
将charset=utf8添加到连接字符串,并将响应字符集设置为UTF-8:
header('Content-Type: text/html;charset=utf-8');
那么,价值观从何而来?你能把范围缩小到导致问题的一个特定值吗?缩小范围后,对该值执行bin2hex$value以查看其字节。检查编码表,如果这些字节对于所需字符的UTF-8是正确的。这些值来自mysql查询,其中数据库和表字符集为utf8,排序规则为utf8\U general\U ci。具体的问题似乎只发生在使用波浪形的人声中:如我的问题中所示的例子?可能的重复肯定是重复的,那么,值来自哪里?你能把范围缩小到导致问题的一个特定值吗?缩小范围后,对该值执行bin2hex$value以查看其字节。检查编码表,如果这些字节对于所需字符的UTF-8是正确的。这些值来自mysql查询,其中数据库和表字符集为utf8,排序规则为utf8\U general\U ci。具体的问题似乎只发生在使用波浪形的人声中:如我的问题中所示,尝试过?可能的重复肯定是重复的