PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不会转义捷克字符。

29 浏览
0 Comments

PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不会转义捷克字符。

我正在从数据库中选择一些数据,并将其编码为json,但是我遇到了一些捷克符号的问题,比如á,í,ř,č,ž...。

我的文件使用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";
    }

部分打印的json:"package":"zv???tkanalouce"

编辑:如果没有mb_convert_encoding()函数,打印的字符串将为空,并打印"error"。

0
0 Comments

PHP - json_encode(string, JSON_UNESCAPED_UNICODE) not escaping czech chars问题的原因是在使用mb_convert_encoding函数时,如果使用编码检测(第三个参数为"auto")并且该编码检测无法处理输入中的某个字符,就会用问号替换它。这也意味着从数据库中获取的数据不是UTF-8编码,因为如果$buffer是UTF-8编码的,mb_convert_encoding($buffer, 'UTF-8', 'auto');不会产生问号。

解决这个问题的方法是找出数据库连接中使用的字符集,因为数据库驱动程序会将字符串转换为连接的编码。最简单的方法是告诉数据库连接使用UTF-8字符串,然后直接使用它们。

下面是设置默认客户端字符集为UTF-8的示例代码(使用mysqli):

$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());
}

然后,你可以改进你的代码:

$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;

这样就可以正确地将捷克字符转换为JSON字符串,而不会出现问号。

0