【问题标题】:php json_encode() show's null instead of textphp json_encode() 显示 null 而不是文本
【发布时间】:2011-12-29 21:35:39
【问题描述】:

我正在从数据库中读取一些希伯来语文本并尝试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。或者数据库表有哪些字符集?
  • 您使用的是什么字符编码?问题肯定是缺少 ',看起来您需要通过将数据编码为 UTF-8 来清理数据库中的数据
  • json_encode 根据文档仅适用于 utf-8 字符串。检查json_last_error() 的输出。 php.net/json-last-error。 utf8 在调用 json_encode 之前对你的字符串进行编码。
  • 这绝对是可编码的:codepad.org/Q6oKBDFg

标签: php json text hebrew


【解决方案1】:

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

mysql_query('SET CHARACTER SET utf8');

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

【讨论】:

    【解决方案2】:
    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));

    【讨论】:

      【解决方案3】:
      $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")
                    );
      

      【讨论】:

        【解决方案4】:

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

        $encodedArray = array_map(utf8_encode, $rawArray);
        

        【讨论】:

          【解决方案5】:

          json_encode 期望数据中的字符串被编码为 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 是的,这是有效的 JSON。如果再次解析,Unicode 转义将映射到适当的 UTF-8 字符串。如果您希望 JSON 不包含这些转义,请将 JSON_UNESCAPED_UNICODE 选项提供给 json_encode(仅限 php 5.4+)。请注意,Unicode 转义允许您的 JSON 遍历 8 位不透明通道(即未正确处理编码的程序)。当您指定 JSON_UNESCAPED_UNICODE 时,您会丢失此信息。
          • 谢谢 phihag!你是一个救生员:)
          【解决方案6】:

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

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          相关资源
          最近更新 更多