将数组转换为 JSON 时,json_encode 返回 JSON_ERROR_UTF8

rfc*_*484 1 php json utf-8 character-encoding

我正在尝试将包含巴西葡萄牙语值的数组转换为 JSON。

\n\n

这是一个数组示例:

\n\n
array(1) {\n  ["title"]=>\n  string(77) "Cart\xc3\xa3o Credicard Universit\xc3\xa1rio Visa Cr\xc3\xa9dito "\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我使用mb_detect_encoding它,它会显示所有值和键都是 ASCII 或 UTF8 格式。

\n\n

但是,如果我尝试使用它json_encode来生成 json,它会返回 false 并且json_last_error函数表示错误是JSON_ERROR_UTF8

\n\n

但是,如果我首先将utf8_encode_deep函数应用于数组(http://php.net/manual/es/function.utf8-encode.php),则会生成 json,而不会给出任何错误。

\n\n

该解决方案的问题在于它返回某些编码错误的单词。

\n\n

例子:

\n\n

申请前的字utf8_encode:Cart\xc3\xa3o(良好的编码)

\n\n

应用后的字utf8_encode:Cart\xc3\x83\xc2\xa3o(编码错误)

\n\n

因此,虽然它生成了 JSON,但它并没有解决我的问题,因为它弄乱了单词。

\n\n

这是我正在使用的代码:

\n\n
try {\n  $dbh = new PDO("mysql:host=$hostname;dbname=$database;", $username, $password);\n  $sql = "SELECT title FROM card";\n  $stmt = $dbh->query($sql);\n\n  $result = $stmt->fetch(PDO::FETCH_ASSOC);\n  $json = $json_encode($result);\n  $error = json_last_error();\n\n  var_dump($json, $error === JSON_ERROR_UTF8);\n} catch (PDOException $e) {\n        echo \'Connection failed: \' . $e->getMessage() . \'\\n\';\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我尝试使用 charset=utf8 或 charset=utf8mb4 连接到数据库,它会检索Cart\xc3\x83\xc2\xa3o(错误的编码),而不是Cart\xc3\xa3o(好的编码)

\n\n

我也尝试使用JSON_UNESCAPED_UNICODEas 参数json_encode,但结果与不使用此参数时的结果相同。

\n\n

有什么建议么?

\n\n

更新:我用发生此问题的一个具体案例简化了示例。

\n\n

更新 2:添加了一些代码以澄清示例,还在注释中添加了一些有关可能解决方案的解释。

\n

Jon*_*oni 5

\n

“如果我尝试使用 charset=utf8 或 charset=utf8mb4 连接到数据库,它将检索 Cart\xc3\x83\xc2\xa3o(糟糕的编码),而不是 Cart\xc3\xa3o(良好的编码)”

\n
\n\n

您使用latin1作为显示编码,因此UTF-8编码的正确文本显示不正确。

\n\n

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

\n\n
header(\'Content-Type: text/html;charset=utf-8\');\n
Run Code Online (Sandbox Code Playgroud)\n