【问题标题】:json_encode function: special charactersjson_encode 函数:特殊字符
【发布时间】:2014-01-08 18:23:45
【问题描述】:

使用 json_encode 对数组进行编码时,包含特殊字符的数组元素将转换为空字符串:

$arr = array ( "funds" => "ComStage STOXX®Europe 600 Techn NR ETF", "time"=>....);
$json = json_encode($arr);

在 JSON 编码后,元素 [funds] 为空。它只发生在特殊字符(版权、商标等)上,例如“ComStage STOXX®Europe 600 Techn NR ETF”中的字符。

有什么建议吗?

谢谢

更新:这是在填充数组之前解决问题的方法(所有名称均来自数据库):

$mysqli->query("SET NAMES 'utf8'");

【问题讨论】:

  • 并非所有特殊字符都是 UTF8。非常 ASCII 的“大于”和“小于”会在 json 编码的字符串中造成严重破坏。我今天刚接了案子。 htmlentities() 或 htmlenspecialchars() 虽然做了他们的工作,但没有提供解决方案。现在我不得不用加号和减号替换它们,以避免 FF 将它们解释为 HTML 标记的开始和结束字符。欢迎任何其他解决方案。

标签: php json


【解决方案1】:

The manual for json_encode specifies this:

所有字符串数据必须是 UTF-8 编码。

因此,在编码之前尝试array_mapping utf8_encode() 到您的数组:

$arr = array_map('utf8_encode', $arr);
$json = json_encode($arr);

// {"funds":"ComStage STOXX\u00c2\u00aeEurope 600 Techn NR ETF"}

作为参考,看看the three examples on this fiddle之间的区别。第一个不使用字符编码,第二个使用htmlentities,第三个使用utf8_encode - 它们都返回不同的结果。

为了保持一致性,您应该使用utf8_encode()

文档

【讨论】:

  • array_map 什么都不做
  • @MuhammadBabar 如果您有任何问题,请提出新问题,我们可以帮助您确定您的代码未按预期运行的原因。
  • 这应该是最好的答案了。
  • 小心! utf8_encode() 仅在源为 ISO-8859-1 时才有效! php.net/manual/en/function.utf8-encode.php
【解决方案2】:

您的输入必须编码为 UTF-8 或 ISO-8859-1。

http://www.php.net/manual/en/function.json-encode.php

因为如果您尝试转换非 utf8 字符数组,您将得到 0 作为返回值。


自 5.5.0 起,失败时的返回值由 null 字符串更改为 FALSE。

【讨论】:

  • 在php.net上写着:All string data must be UTF-8 encoded..
  • 我尝试清理字符串以符合 UTF-8 没有任何成功。什么对我有用 - 在填充数组之前将 MySQL 名称设置为 UTF-8: $mysqli->query("SET NAMES 'utf8'");现在所有特殊字符都显示得很好。
  • 您可能想使用 PDO 而不是 mysqli 顺便说一句。恕我直言,它提供了更多功能:)
  • @user2723490 您的建议为我解决了问题。尝试utf_encode 带重音的 e 给了我“数组”这个词作为我的结果,但是在从数据库端取出它的过程中效果很好。谢谢!
  • 兄弟们我正面临这个问题,请检查我的问题。 stackoverflow.com/questions/49998897/…
【解决方案3】:

对我来说,它是这样工作的:

# Creating the ARRAY from Result.
$array=array();

while($row = $result->fetch_array(MYSQL_ASSOC))
{
    # Converting each column to UTF8
    $row = array_map('utf8_encode', $row);
    array_push($array,$row);
}

json_encode($array);

【讨论】:

    【解决方案4】:

    你应该使用这个代码:

    $json = json_encode(array_map('utf8_encode', $arr))
    

    array_map 函数转换 UTF8 标准中的特殊字符

    【讨论】:

    【解决方案5】:

    使用下面的函数。

    function utf8_converter($array)
    {
        array_walk_recursive($array, function (&$item, $key) {
            if (!mb_detect_encoding($item, 'utf-8', true)) {
                    $item = utf8_encode($item);
            }
        });
    
        return $array;
    }
    

    【讨论】:

      【解决方案6】:

      为了避免特殊字符的转义,我传递了标志:

      JSON_UNESCAPED_UNICODE

      像这样:

      json_encode($array, JSON_UNESCAPED_UNICODE)
      

      【讨论】:

        【解决方案7】:

        使用此代码 mysql_set_charset("UTF8", $connection);

        示例 $connection = mysql_connect(DB_HOST_GATEWAY,DB_USER_GATEWAY, DB_PASSWORD_GATEWAY); mysql_set_charset("UTF8", $connection); mysql_select_db(DB_DATABASE_GATEWAY,$connection);

        【讨论】:

          【解决方案8】:

          您应该在元标记中添加 charset=UTF-8 并将 json_encode 用于特殊字符

          $json = json_encode($arr);

          json_encode 函数转换 UTF8 标准中的特殊字符

          【讨论】:

            【解决方案9】:

            要解决特殊字符问题,您只需要做两件事

            1.mysql_set_charset('utf8'); // 将此行设置在您使用 json 的页面顶部。

            1. 如果您在数据库中保存 json 数据,请确保特定列排序规则设置为“latin1_swedish_ci”。

            【讨论】:

              猜你喜欢
              • 2017-02-27
              • 2018-07-16
              • 1970-01-01
              • 2015-07-08
              • 2016-12-08
              • 2017-07-12
              • 2011-08-12
              • 1970-01-01
              • 2012-03-06
              相关资源
              最近更新 更多