Jak*_*sky 4 php encoding json utf-8
我正在从数据库中选择一些数据并将它们编码为json,但我遇到了类似捷克标志的问题
A,I,R,C,Z ...
我的文件是utf-8编码,我的数据库也是utf-8编码,我也设置了头文件到utf-8编码.我还应该做什么?
我的代码:
header('Content-Type: text/html; charset=utf-8');
while($tmprow = mysqli_fetch_array($result)) {
$row['user'] = mb_convert_encoding($tmprow['user'], "UTF-8", "auto");
$row['package'] = mb_convert_encoding($tmprow['package'], "UTF-8", "auto");
$row['url'] = mb_convert_encoding($tmprow['url'], "UTF-8", "auto");
$row['rating'] = mb_convert_encoding($tmprow['rating'], "UTF-8", "auto");
array_push($response, $row);
}
$json = json_encode($response, JSON_UNESCAPED_UNICODE);
if(!$json) {
echo "error";
}
Run Code Online (Sandbox Code Playgroud)
和部分印刷的json: "package":"zv???tkanalouce"
编辑:没有mb_convert_encoding()函数,打印的字符串为空,并打印"错误".
hak*_*kre 11
使用您在示例中获得的代码,输出为:
json_encode($response, JSON_UNESCAPED_UNICODE);
"package":"zv???tkanalouce"
Run Code Online (Sandbox Code Playgroud)
你在那里看到了问号,因为它们已被引入mb_convert_encoding.当您使用编码检测(" auto"作为第三个参数)并且编码检测无法处理输入中的字符,将其替换为问号时,会发生这种情况.示例性代码行:
$row['url'] = mb_convert_encoding($tmprow['url'], "UTF-8", "auto");
Run Code Online (Sandbox Code Playgroud)
这也意味着来自数据库的数据不是 UTF-8编码的,因为mb_convert_encoding($buffer, 'UTF-8', 'auto');如果$buffer是UTF-8编码则不会引入问号.
因此,您需要找出数据库连接中使用的字符集,因为数据库驱动程序会将字符串转换为连接的编码.
最简单的是你只需告诉每个数据库链接你要求UTF-8字符串然后只使用它们:
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
/* change character set to utf8 */
if (!$mysqli->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
printf("Current character set: %s\n", $mysqli->character_set_name());
}
Run Code Online (Sandbox Code Playgroud)
前面的代码示例演示了如何使用mysqli将默认客户端字符集设置为UTF-8.它已经从手册中获取,请参阅我们现场的材料,例如utf 8 - PHP和MySQLi UTF8.
然后,您可以大大改善您的代码:
$response = $result->fetch_all(MYSQLI_ASSOC);
$json = json_encode($response, JSON_UNESCAPED_UNICODE);
if (FALSE === $json) {
throw new LogicException(
sprintf('Not json: %d - %s', json_last_error(), json_last_error_msg())
);
}
header('Content-Type: application/json');
echo $json;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21095 次 |
| 最近记录: |