我已经在PHP 5.6上克服了这种行为(在PHP 5.4中也是相同的,直到7.0)。
$note = new SimpleXMLElement('<Note></Note>');
$note->addChild("string0", 'just a string');
$note->addChild("string1", "abc\n\n\n");
$note->addChild("string2", "\tdef");
$note->addChild("string3", "\n\n\n");
$note->addChild("string4", "\t\n");
$json = json_encode($note, JSON_PRETTY_PRINT);
print($json);
输出:
{
"string0": "just a string",
"string1": "abc\n\n\n",
"string2": "\tdef",
"string3": {
"0": "\n\n\n"
},
"string4": {
"0": "\t\n"
}
}
这种行为背后一定有理由,我想了解。而且,如果你知道一种方法来强制它对文本和空格字符串的行为方式相同,我将非常感谢你分享你的想法!
编辑。这是您可以运行的代码段:http://sandbox.onlinephpfunctions.com/code/d797623553c11b7a7648340880a92e98b19d1925
答案 0 :(得分:1)
这来自RFC 4627(强调我的)
所有Unicode字符都可以放在引号中,但必须转义的字符除外:引号,反向固定和控制字符(U + 0000到U + 001F) )强>
换行符(\n
)在UTF-8中为U+000A
,因此PHP尽职地将其转换回各自的JS等价物
PHP将此RFC用于json_encode
PHP实现了原始»RFC 4627中指定的JSON超集 - 它还将编码和解码标量类型和NULL。
正如我在评论中所提到的,PHP的所有版本(返回5.2)都是这样做的(Demo)