我想要一个以换行符分隔的 JSON 记录文件。所以记录中的换行符必须被转义。
我在 python 中的测试字符串确实被转义了。但它在所有 JSON 实现(如 Java 的)中都能得到保证吗?
如果字符串被正确转义,只要实现符合JSON 规范,您就不必担心不同的实现。XML 和 JSON 等数据交换格式旨在解决互操作性的难题。作为简单的文本格式,它们在所有实现中都以类似的方式进行解释。
通过让我们指定编码格式,XML 与 JSON 相比提供了更精细的控制。然而,JSON 在这方面迫使我们遵循 unicode 编码。
注意:简而言之,不要担心 JSON 本身,但不要忘记在标准 ASCII 字符上使用 unicode 字符串(python <= 2.7 中的默认值)。这将确保 JAVA 以正确的方式解释字符串,因为 JAVA 默认具有 unicode 编码格式。
更正:我之前说过 JSON 规范是明确的,但事实证明,网站上的非正式 JSON 规范并没有我想象的那么明确,而且更明确的 RFC 实际上对术语“控制字符”的解释与Unicode 标准。
来自JSON RFC:
所有 Unicode 字符都可以放在引号内,但必须转义的字符除外:引号、反斜线和控制字符(U+0000 到 U+001F)。
请注意,此控制字符的定义与 unicode 不同:
http://www.fileformat.info/info/unicode/category/Cc/list.htm
Unicode 考虑字符 U+007F 到 U+009F 控制字符,而 JSON RFC 说它们不是。
这是一个在 unicode 中被视为换行符的字符表:
http://www.unicode.org/standard/reports/tr13/tr13-5.html
Unicode ASCII EBCDIC*
CR 000D 0D 0D 0D
LF 000A 0A 25 15
CRLF 000D,000A 0D,0A 0D,25 0D,15
NEL* 0085 85 15 25
VT 000B 0B 0B 0B
FF 000C 0C 0C 0C
LS 2028 n/a n/a n/a
PS 2029 n/a n/a n/a
换行符中的两个,行 (U+2028) 和段落 (U+2029) 分隔符,不是unicode 控制字符。它们每个都属于自己的 unicode 类别。NEL 字符 (U+0085) 是 unicode 控制字符,但在 JSON 中不被视为控制字符。所有这三个都可以在 JSON 字符串中以非转义形式出现并代表它们自己。
您可以确信任何值得其盐分的 JSON 库都不会包含未转义的 CR 或 LF。您也不应该看到未转义的 VT 或 FF。但是,您会看到 NEL、LS 和 PS 字符在 JSON 中未转义。
(我以前认为 NEL 被认为是 JSON 中的控制字符。在此基础上,我向 Python 提交了这个错误报告,在那里我向我指出了我的错误:http: //bugs.python.org/issue21194)
根据JSON 规范:
字符串是零个或多个 Unicode 字符的序列,用双引号括起来,使用反斜杠转义。字符表示为单个字符串。字符串与 C 或 Java 字符串非常相似。
所以是的,它们在所有符合标准的实现中都被转义了。