MySQL到JSON:UTF-8中德语特殊字符的编码问题


MySQL to JSON: Issue with encoding of German special characters in UTF-8

我写了一个小脚本,从MySQL表中获取数据并将其放入JSON数组中。然而,字符编码有一个问题,尽管我在所有地方都设置了UTF-8。这是脚本:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>JSON</title>
</head>
<?php
header('Content-type: text/html; charset=UTF-8');
$con = mysqli_connect("HOST", "USERNAME", "PASSWORD", "DATABASE");
if (!$con) {
    trigger_error('Could not connect to MySQL: ' . mysqli_connect_error());
}
mysqli_set_charset($con,"utf8");
mysql_query("SET NAMES SET 'utf8'"); 
mysql_query("SET character_set_client = 'utf8'"); 
mysql_query("SET character_set_connection = 'utf8'"); 
mysql_query("SET character_set_results = 'utf8'");
$sql = "SELECT * FROM table";
$result = mysqli_query($con, $sql);
$rows = array();
while($r = mysqli_fetch_assoc($result)) {
    $rows[]=$r;
}
print json_encode($rows);

mysqli_close($con);
?>
</html>

在输出中,我得到的值是"''u00e4",而不是"ä"。

一些附加信息:

  • 表位于utf8_general_ci中(其所有列也是如此)
  • PHP文档使用UTF8

我做错了什么?谢谢你的帮助!!

看起来一切正常。之所以看到'u00e4而不是ä,是因为JSON序列化程序的实现。序列化程序所做的工作是完全有效的。

来自JSON RFC第2.5节字符串

任何字符都可以转义。如果角色在Basic多语言平面(U+0000到U+FFFF),则它可能是表示为六个字符的序列:后面跟着一个反向solidus后跟小写字母u,后跟四个十六进制数字对字符的代码点进行编码。十六进制字母AF可以是大写或小写。例如,一个字符串包含只有一个反向solidus字符可以表示为"''u005C"。

我怀疑这个序列化程序为您转义它的原因是因为PHP本身不支持unicode。

字符串是一系列字符,其中一个字符与字节这意味着PHP只支持256个字符集,因此不支持提供本机Unicode支持。