基于文档 http://docs.php.net/manual/en/json.constants.php,我预计JSON_UNESCAPED_LINE_TERMINATORS
保留换行符 (\n
) 字符未转义,因此在编码 JSON 时作为实际换行符:
JSON_UNESCAPED_LINE_TERMINATORS
(整数)
行终止符在以下情况下保持未转义:JSON_UNESCAPED_UNICODE
已提供。它使用与 PHP 7.1 之前相同的行为,但没有此常量。从 PHP 7.1.0 开始可用。
最小的例子:
$ php -r 'echo json_encode(["foo" => "bar\nbaz"], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_LINE_TERMINATORS) . "\n";'
{"foo":"bar\nbaz"}
我期望:
{"foo":"bar
baz"}
(Note that this is valid JSON; only \
and "
must be escaped in a string.)
为什么这个选项没有按预期工作?
[编辑] 我错误地阅读了 JSON 规范:字符串内未编码的换行符是not有效的 JSON。控制字符从 U+0000 到 U+001Fmust被逃脱。 PHP 不包含未编码的内容是正确的,尽管文档显然可以改进!
我必须去source https://github.com/php/php-src/blob/da0663a337b608a4b0008672b494e3a71e6e4cfc/ext/json/json_encoder.c#L340找出这一点。本文中的“行终止符”仅指晦涩的 Unicode 代码点 U+2028 行分隔符和 U+2029 段落分隔符:
/* Escape U+2028/U+2029 line terminators, UNLESS both
JSON_UNESCAPED_UNICODE and
JSON_UNESCAPED_LINE_TERMINATORS were provided */
} else if ((options & PHP_JSON_UNESCAPED_UNICODE)
&& ((options & PHP_JSON_UNESCAPED_LINE_TERMINATORS)
|| us < 0x2028 || us > 0x2029)) {
这与 Unicode 的内容相冲突defines https://en.wikipedia.org/wiki/Newline#Unicode作为行终止符:
Unicode 标准定义了一些符合应用程序应将其识别为行终止符的字符:
LF: Line Feed, U+000A
VT: Vertical Tab, U+000B
FF: Form Feed, U+000C
CR: Carriage Return, U+000D
CR+LF: CR (U+000D) followed by LF (U+000A)
NEL: Next Line, U+0085
LS: Line Separator, U+2028
PS: Paragraph Separator, U+2029
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)