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

mwi*_*rek 9 php json utf-8

我有一组通过JSON从DB(编码的UTF-8)传递的关键字,其中一些可能有特殊字符,如é,è,ç等.这用作自动完成程序的一部分.例:

array('Coffee', 'Cappuccino', 'Café');
Run Code Online (Sandbox Code Playgroud)

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

array('Coffee', 'Cappuccino', 'Café');
Run Code Online (Sandbox Code Playgroud)

但是JSON编码为:

["coffee", "cappuccino", null];
Run Code Online (Sandbox Code Playgroud)

如果我通过print_r()打印这些,它们在UTF-8编码的网页上显示正常,但是如果我想使用print_r($ array)查看数组,如果使用text/plain,café就会显示为"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);
}
Run Code Online (Sandbox Code Playgroud)

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

编辑:DB连接方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

更多更新:我运行的简单PHP脚本:

echo json_encode( array("Café") ); // ["Caf\u00e9"]
echo json_encode( array("Café") ); // null
Run Code Online (Sandbox Code Playgroud)

ılǝ*_*ılǝ 11

原因可能是当前的客户端字符设置.一个简单的解决方案可能是mysql_query('SET CHARACTER SET utf8') 在运行SELECT查询之前设置客户端 .

更新(2014年6月)

从PHP 5.5.0开始,不推荐使用mysql扩展.现在建议使用mysqli.此外,在进一步阅读时 - 出于安全原因,应避免使用上述设置客户端集的方法.

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

$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
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)

或者使用连接参数:

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


Rak*_*ard 1

在执行 json_encode() 之前尝试通过此函数发送数组:

<?php

function utf8json($inArray) {

    static $depth = 0;

    /* our return object */
    $newArray = array();

    /* safety recursion limit */
    $depth ++;
    if($depth >= '30') {
        return false;
    }

    /* step through inArray */
    foreach($inArray as $key=>$val) {
        if(is_array($val)) {
            /* recurse on array elements */
            $newArray[$key] = utf8json($inArray);
        } else {
            /* encode string values */
            $newArray[$key] = utf8_encode($val);
        }
    }

    /* return utf8 encoded array */
    return $newArray;
}
?>
Run Code Online (Sandbox Code Playgroud)

摘自 phpnet @ http://php.net/manual/en/function.json-encode.php上的评论。

该函数基本上循环遍历数组元素,也许您对数组本身进行了 utf-8 编码?