Php 将数组转换为json时,json_encode返回json_错误\u UTF8

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

我正在尝试将一个带有巴西葡萄牙语值的数组转换为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

但是如果我首先将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。具体的问题似乎只发生在使用波浪形的人声中:如我的问题中所示,尝试过?可能的重复肯定是重复的