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_map
ping 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 函数:特殊字符的主要内容,如果未能解决你的问题,请参考以下文章