PHP的json_encode()函数显示null而不是文本

12

我从数据库读取一些希伯来文本,并尝试使用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"}]

我认为问题出在我的数据库文本中包含了(')符号。尝试过多种组合的stripslashes或real_escape_string均没有帮助。


不是单引号问题。很可能是您的文本编码不是UTF-8。或者数据库表使用哪种字符集? - mario
你使用的是哪种字符编码?问题肯定是由于缺少“,”引起的,看起来你需要通过将数据编码为UTF-8来清理数据库中的数据。 - Bob Gregor
根据文档,json_encode仅适用于utf-8字符串。请检查json_last_error()的输出。http://php.net/json-last-error。在调用json_encode之前,请对您的字符串进行utf8编码。 - Frank Farmer
1
这绝对是可编码的:http://codepad.org/Q6oKBDFg - NullUserException
可能是重复的问题:json_encode返回NULL? - mario
[{"value":"88","text":"这是第一项","parent_id":"1","level":"1"},{"value":"89","text":"这是第二项","parent_id":"1","level":"1"},{"value":"91","text":"这是第三项","parent_id":"1","level":"1"}],这个有效吗?我能用JS解码它吗? - eric.itzhak
6个回答

22

json_encode 要求数据中的字符串以 UTF-8 格式进行编码。

如果数据中的字符串还没有以 UTF-8 格式编码,请将它们转换为 UTF-8 格式。

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

现在它打印出了:[{"value":"88","text":"\u00eb\u00e9\u00fa\u00e4 \u00e0'","parent_id":"1","level":"1"},{"value":"89","text":"\u00eb\u00e9\u00fa\u00e4 \u00e1'","parent_id":"1","level":"1"},{"value":"91","text":"\u00eb\u00e9\u00fa\u00e4 \u00e2'","parent_id":"1","level":"1"}] 这就是它应该的样子吗?我不应该将其作为文本看到吗? - eric.itzhak
1
@eric.itzhak 是的,那是有效的JSON。如果您再次解析它,Unicode转义将映射到适当的UTF-8字符串。如果您希望JSON不包含这些转义,请在json_encode中使用JSON_UNESCAPED_UNICODE选项(仅适用于php 5.4+)。请注意,Unicode转义允许您的JSON通过8位不透明通道遍历(即不能正确处理编码的程序)。当您指定JSON_UNESCAPED_UNICODE时,您会失去这个功能。 - phihag

2

我找到的最好、最快的解决方案是由Sam Barnum在PHP参考手册中提供的JSON编码函数

$encodedArray = array_map(utf8_encode, $rawArray);

2
$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")
              );

0
尝试使用json_encode($string, JSON_UNESCAPED_UNICODE);(仅适用于PHP v5.4.0+ - 请参见docs)。

如果您使用此方法,您需要添加标题。如何防止json_encode()删除具有无效字符的字符串header('Content-Type: application/json; charset=utf-8'); - Wingman1487

0

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

mysql_query('SET CHARACTER SET utf8');

如果您只想在特定查询中使用它,那么请在执行查询之前使用它。

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

这个递归函数将把 null 值转换为空字符串 ''。在调用 json_encode($your_array) 时,使用 json_encode(change_null($your_array))。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接