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

Posted

技术标签:

【中文标题】PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不转义捷克字符【英文标题】:PHP - json_encode(string, JSON_UNESCAPED_UNICODE) not escaping czech chars 【发布时间】:2014-06-12 21:23:19 【问题描述】:

我正在从数据库中选择一些数据并将它们编码为 json,但是我遇到了像

这样的捷克符号的问题

á,í,ř,č,ž...

我的文件是 utf-8 编码,我的数据库也是 utf-8 编码,我也将 header 设置为 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() 函数,打印的字符串为空,并且打印“错误”。

【问题讨论】:

如果要输出JSON,不要在header中设置Content-Type: text/html,使用Content-Type: application/json 只需通过该连接告诉您的数据库驱动程序您期望 UTF-8 编码的字符串值,丢弃您插入的 mb_convert_encoding(编码没有“自动”,您要么知道你做什么或者你在自己的脚下射击,没有电脑可以代替你),你应该没问题。 您希望mb_convert_encoding($tmprow['rating'], "UTF-8", "auto") 做什么?为什么有必要? "auto" 编码参数代表什么?这是否意味着您不知道您的字符串具有哪种编码以及您需要使用哪种编码?请分享。 @Holt 现在看起来好多了,但是那些字符仍然看起来像'?',但是谢谢 @hakre "auto" 应该代表自动检测输入编码。 【参考方案1】:

使用示例中的代码,输出为:

json_encode($response, JSON_UNESCAPED_UNICODE);
"package":"zv???tkanalouce"

您会看到其中的问号,因为它们是由mb_convert_encoding 介绍的。当您使用编码检测(“auto”作为第三个参数)并且编码检测无法处理输入中的字符时,会发生这种情况,将其替换为问号。示例代码行:

$row['url'] = mb_convert_encoding($tmprow['url'], "UTF-8", "auto");

这也意味着来自您的数据库的数据不是 UTF-8 编码的,因为如果$buffer 是 UTF-8 编码,mb_convert_encoding($buffer, 'UTF-8', 'auto'); 不会引入问号。

因此您需要找出在您的数据库连接中使用了哪个字符集,因为数据库驱动程序会将字符串转换为连接的编码。

最简单的是,您只需根据该数据库链接告诉您要使用 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。一直是taken from the manual,请参阅我们在现场提供的有关此的材料,例如utf 8 - php and 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;

【讨论】:

以上是关于PHP - json_encode(string, JSON_UNESCAPED_UNICODE) 不转义捷克字符的主要内容,如果未能解决你的问题,请参考以下文章

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

json_encode() 删除属性 (PHP)

php json_encode 返回false

PHP json_encode json_decode UTF-8

php-base64编码的数据在json_encode之后丢失

php json_encode使用中文不转码