我正在编写一个使用json表示其资源的web服务,并且我在思考对json进行编码的最佳方法有些困惑。读取json rfc(http://www.ietf.org/rfc/rfc4627.txt)显然,首选编码是utf-8。但是RFC还描述了用于指定字符的字符串转义机制。我认为这通常用于转义非ASCII字符,从而使生成的utf-8有效ASCII。
假设我有一个包含非ASCII字符(代码点)的json字符串。我的网络服务应该只是对utf-8编码并返回它,还是应该转义所有这些非ascii字符并返回纯ascii?
我希望浏览器能够使用jsonp或eval执行结果。这会影响决策吗?我缺乏对utf-8的各种浏览器javascript支持的知识。
编辑:我想澄清一下,我对如何编码结果的主要担心实际上是关于浏览器对结果的处理。我所读的内容表明,特别是使用JSONP时,浏览器可能对编码敏感。我还没有找到关于该主题的任何非常好的信息,因此我必须开始进行一些测试才能看到会发生什么。理想情况下,我只想转义所需的几个字符,而只是utf-8对结果进行编码。
JSON规范 要求 解码器支持UTF-8。结果,所有JSON解码器都可以处理UTF-8,也可以处理数字转义序列。Java解释器也是如此,这意味着JSONP也将处理UTF-8编码的JSON。
JSON编码器使用数字转义序列的功能只是为您提供了更多选择。选择数字转义序列的一个原因是,如果编码器和预期的解码器 之间 的传输机制不是二进制安全的。
你可能想要使用数字转义序列的另一个原因是为了防止出现在流中的某些字符,例如<,&和",如果JSON代码被置于不逃逸到HTML或错误地将其解释浏览器作为HTML,其可被解释为HTML序列。这可以抵御HTML注入或跨站点脚本的攻击(注意:某些字符必须在JSON中转义,包括"和\)。
<
&
"
\
一些框架,包括PHP的JSON实现, 总是 在编码器端对ASCII以外的任何字符执行数字转义序列。这旨在与有限的传输机制等实现最大的兼容性。但是,这不应解释为JSON解码器在UTF-8上存在问题的指示。
因此,我想您只是可以像这样决定使用哪个:
除非您的编码器和解码器之间的存储或传输方法不是二进制安全的,否则请仅使用UTF-8。
否则,请使用数字转义序列。