加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – UTF-8中的值在JSON中被编码为NULL

发布时间:2020-12-13 16:31:09 所属栏目:PHP教程 来源:网络整理
导读:我有一组通过 JSON传递的关键字(编码的UTF-8),其中一些可能具有é,è,?等特殊字符.这是用作自动完成器的一部分.例: array('Coffee','Cappuccino','Café'); 我应该补充说,它来自数据库的数组将是: array('Coffee','Caf??'); 但JSON编码为: ["coffee","cap
我有一组通过 JSON传递的关键字(编码的UTF-8),其中一些可能具有é,è,?等特殊字符.这是用作自动完成器的一部分.例:
array('Coffee','Cappuccino','Café');

我应该补充说,它来自数据库的数组将是:

array('Coffee','Caf??');

但JSON编码为:

["coffee","cappuccino",null];

如果我通过print_r()打印这些文件,它们会在UTF-8编码的网页上显示出来,但如果要使用print_r($array)查看数组,则使用“caf??” ;出口();.

如果我在编码JSON之前使用utf8_encode()进行编码,那么它会很好,但在网页上打印的内容是“café”而不是“café”.

也很奇怪,但是json_last_error()被看作是一个未定义的函数,但json_decode()和json_encode()可以正常工作.

关于如何从数据库中获取UTF-8编码数据的任何想法在整个过程中表现相同?

EIDT:这是获取关键字并使其成为单个数组的PHP函数:

private function get_keywords() 
{
    global $db,$json;

    $output = array();

    $db->query("SELECT keywords FROM listings");

    while ($r = $db->get_array())
    {
        $split = explode(",",$r['keywords']);

        foreach ($split as $s)
        {
            $s = trim($s);
            if ($s != "" && !in_array($s,$output)) $output[] = strtolower($s);
        }
    }

    $json->echo_json($output);
}

json :: echo_json方法只是编码,设置标题并打印它(用于Prototype)

编辑:数据库连接方式:

function connect()
{

    if ($this->set['sql_connect'])
    {
        $this->connection = @mysql_connect( $this->set['sql_host'],$this->set['sql_user'],$this->set['sql_pass'])
                OR $this->debug( "Connection Error",mysql_errno() .": ". mysql_error());
        $this->db = @mysql_select_db( $this->set['sql_name'],$this->connection)
                OR $this->debug( "Database Error","Cannot Select Database '". $this->set['sql_name'] ."'");

        $this->is_connected = TRUE;
    }

    return TRUE;
}

更多更新:
简单的PHP脚本我跑了:

echo json_encode( array("Caf??") ); // ["Cafu00e9"]
echo json_encode( array("Café") ); // null
原因可能是当前的客户端字符设置.一个简单的解决方案可能是设置客户端
mysql_query(‘SET CHARACTER SET utf8’)
运行SELECT查询之前.

更新(2014年6月)

从PHP 5.5.0起,mysql扩展名已被弃用.现在建议使用mysqli.另外,进一步阅读 – 应该避免上述设置客户端的方法for reasons including security.

我没有测试,但这应该是一个好的替代品:

$mysqli = new mysqli("localhost","my_user","my_password","my_db");
if (!$mysqli->set_charset('utf8')) {
    printf("Error loading character set utf8: %sn",$mysqli->error);
} else {
    printf("Current character set: %sn",$mysqli->character_set_name());
}

或使用连接参数:

$conn = mysqli_connect("localhost","my_db");
if (!mysqli_set_charset($conn,"utf8")) {
    # TODO - Error: Unable to set the character set
    exit;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读