有什么原因导致PHP的json_encode函数不能转义字符串中的所有JSON控制字符吗?
例如,让我们来看一个跨越两行的字符串,其中包含控制字符(\r \n“/):
<?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。但是如果你试图解析这个编码的字符串,它会抛出一个错误:
<script type="text/javascript">
JSON.parse(<?php echo $s ?>); // Will throw SyntaxError
</script>而且你不能得到数据!如果删除或转义字符串中\r \n“和\,则JSON.parse()不会抛出错误。
是否有任何现有的,良好的PHP函数转义控制字符。带有搜索和替换数组的简单str_replace将不起作用。
发布于 2009-06-26 11:12:37
哦-你需要双重编码: JSON.parse当然需要一个字符串:
<script type="text/javascript">
JSON.parse(<?php echo json_encode($s) ?>);
</script>发布于 2010-09-01 15:31:50
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 )。
发布于 2010-08-17 22:14:15
我还没有想出任何没有str_replace的解决方案..
试试这段代码。
$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);希望这能帮上忙。
https://stackoverflow.com/questions/1048487
复制相似问题