使用示例中的代码,输出为:
json_encode($response, JSON_UNESCAPED_UNICODE);
"package":"zv???tkanalouce"
你看到那里的问号是因为它们是由mb_convert_encoding
。当您使用编码检测时会发生这种情况(“auto
“作为第三个参数)并且编码检测无法处理输入中的字符,将其替换为问号。示例代码行:
$row['url'] = mb_convert_encoding($tmprow['url'], "UTF-8", "auto");
这也意味着来自数据库的数据是notUTF-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());
}
前面的代码示例仅展示了如何使用 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;