json_encode 函数:特殊字符

Posted

技术标签:

【中文标题】json_encode 函数:特殊字符【英文标题】:json_encode function: special characters 【发布时间】: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 标记的开始和结束字符。欢迎任何其他解决方案。 【参考方案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()

文档

json_encode() utf8_encode() array_map()

【讨论】:

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 给了我“数组”这个词作为我的结果,但是在从数据库端取出它的过程中效果很好。谢谢! 兄弟们我正面临这个问题,请检查我的问题。 ***.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 标准中的特殊字符

【讨论】:

您的答案似乎是来自the answer from half a year ago 的代码的复制/粘贴,但合并为一条语句。 好答案。先生,我向您致敬! 小心! utf8_encode() 仅在源为 ISO-8859-1 时有效! php.net/manual/en/function.utf8-encode.php【参考方案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 的页面顶部。

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

【讨论】:

以上是关于json_encode 函数:特殊字符的主要内容,如果未能解决你的问题,请参考以下文章

mysql 有几个特殊字符的函数

php mysql转义特殊字符的函数都有哪些

php怎样过滤掉特殊字符啊 ☺

标量值函数—— 判断是否存在特殊字符

如何转义通过 JQuery ajax 函数发送的查询字符串中的特殊字符?

正则表达式函数中的特殊字符问题