php json_encode()显示为null而不是text

时间:2011-11-15 21:09:08

标签: php json text hebrew

我正在使用希伯来语中的一些文本从数据库中读取并尝试json_encode它。 如果我print_r得到的结果:

Array
(
    [0] => Array
        (
            [value] => 88
            [text] => כיתה א'
            [parent_id] => 1
            [level] => 1
        )

    [1] => Array
        (
            [value] => 89
            [text] => כיתה ב'
            [parent_id] => 1
            [level] => 1
        )

    [2] => Array
        (
            [value] => 91
            [text] => כיתה ג'
            [parent_id] => 1
            [level] => 1
        )

)

,而json_encode显示:

[{"value":"88","text":null,"parent_id":"1","level":"1"},{"value":"89","text":null,"parent_id":"1","level":"1"},{"value":"91","text":null,"parent_id":"1","level":"1"}]

我相信它是因为我的数据库中的文本包含一个(')标记。 尝试过各种条带组合或者real_escape_string都没有帮助。

6 个答案:

答案 0 :(得分:20)

json_encode期望数据中的字符串被编码为UTF-8。

如果它们不是,则将它们转换为UTF-8:

$results = array_map(function($r) {
  $r['text'] = utf8_encode($r['text']);
  return $r;
}, $results);
echo json_encode($results);

答案 1 :(得分:2)

我找到的最佳和最快的解决方案是in the PHP Reference itself, by Sam Barnum

$encodedArray = array_map(utf8_encode, $rawArray);

答案 2 :(得分:1)

$dbh = new PDO('mysql:host=localhost;dbname=test', 
                $user, 
                $pass
              ); 

$dbh->exec("SET CHARACTER SET utf8");

$dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", 
                $dbuser, 
                $dbpass, 
                array( PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
              );

答案 3 :(得分:0)

尝试json_encode($string, JSON_UNESCAPED_UNICODE);(仅适用于PHP v5.4 + + - 请参阅docs)。

答案 4 :(得分:0)

function change_null($d) 
{
    if (is_array($d)) {
        foreach ($d as $k => $v) {
            $d[$k] = change_null($v);
        }
    } else if(is_null($d))
    {
        return '';
    }
    return $d;
}

此递归函数会将空值更改为“空字符串”。调用json_encode($ your_array)到json_encode(change_null($ your_array));

答案 5 :(得分:0)

最简单的方法之一是为MySQL查询设置CHARSET。如果要为所有查询设置相同的字符集,则只需在配置或数据库连接文件中添加以下内容。

mysql_query('SET CHARACTER SET utf8');

如果您只想在特定查询中使用它,那么只需在执行查询之前使用此权限