首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP并不能转义所有的json_encode控制字符

问PHP并不能转义所有的json_encode控制字符
EN

Stack Overflow用户
提问于 2009-06-26 10:54:18
回答 12查看 61.2K关注 0票数 27

有什么原因导致PHP的json_encode函数不能转义字符串中的所有JSON控制字符吗?

例如,让我们来看一个跨越两行的字符串,其中包含控制字符(\r \n“/):

代码语言:javascript
复制
<?php
$s = <<<END
First row.
Second row w/ "double quotes" and backslash: \.
END;

$s = json_encode($s);
echo $s;
// Will output: "First row.\r\nSecond row w\/ \"double quotes\" and backslash: \\."
?>

请注意,回车符和换行符是未转义的。为什么?

我使用jQuery作为我的JS库,当您完全、100%信任传入数据时,它的$.getJSON()函数会做得很好。否则,我会像其他人一样使用JSON.org的库json2.js。但是如果你试图解析这个编码的字符串,它会抛出一个错误:

代码语言:javascript
复制
<script type="text/javascript">

JSON.parse(<?php echo $s ?>);  // Will throw SyntaxError 

</script>

而且你不能得到数据!如果删除或转义字符串中\r \n“和\,则JSON.parse()不会抛出错误。

是否有任何现有的,良好的PHP函数转义控制字符。带有搜索和替换数组的简单str_replace将不起作用。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2009-06-26 11:12:37

哦-你需要双重编码: JSON.parse当然需要一个字符串:

代码语言:javascript
复制
<script type="text/javascript">

JSON.parse(<?php echo json_encode($s) ?>);

</script>
票数 13
EN

Stack Overflow用户

发布于 2010-09-01 15:31:50

代码语言:javascript
复制
function escapeJsonString($value) {
    # list from www.json.org: (\b backspace, \f formfeed)    
    $escapers =     array("\\",     "/",   "\"",  "\n",  "\r",  "\t", "\x08", "\x0c");
    $replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t",  "\\f",  "\\b");
    $result = str_replace($escapers, $replacements, $value);
    return $result;
  }

我正在使用上面的函数,它对反斜杠进行转义(必须是数组中的第一个),并且应该处理换页和退格符(我不认为PHP中支持\f和\b )。

票数 29
EN

Stack Overflow用户

发布于 2010-08-17 22:14:15

我还没有想出任何没有str_replace的解决方案..

试试这段代码。

代码语言:javascript
复制
$json_encoded_string = json_encode(...);
$json_encoded_string = str_replace("\r", '\r', $json_encoded_string);
$json_encoded_string = str_replace("\n", '\n', $json_encoded_string);

希望这能帮上忙。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1048487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档