JSON字符编码-浏览器是否很好地支持UTF-8,还是应该使用数字转义序列?

我正在编写一个使用json表示其资源的web服务,并且我在思考对json进行编码的最佳方法有些困惑。读取json rfc(http://www.ietf.org/rfc/rfc4627.txt)显然,首选编码是utf-8。但是RFC还描述了用于指定字符的字符串转义机制。我认为这通常用于转义非ASCII字符,从而使生成的utf-8有效ASCII。

假设我有一个json字符串,其中包含非ascii的Unicode字符(代码点)。我的Web服务应该只是对utf-8编码并返回它,还是应该转义所有这些非ascii字符并返回纯ascii?

我希望浏览器能够使用jsonp或eval执行结果。这会影响决策吗?我缺乏对utf-8的各种浏览器javascript支持的知识。

编辑:我想澄清一下,我对如何编码结果的主要担心实际上是关于浏览器对结果的处理。我所读的内容表明,特别是在使用JSONP时,浏览器可能对编码敏感。我还没有找到关于该主题的任何非常好的信息,所以我必须开始做一些测试才能看到会发生什么。理想情况下,我只想转义所需的那几个字符,而只是utf-8对结果进行编码。


万千封印
浏览 581回答 3
3回答

噜噜哒

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。否则,请使用数字转义序列。

慕妹3242003

我在那里有问题。当我使用“é”等字符对字符串进行JSON编码时,除IE会返回“ \ u00e9”外,每个浏览器都将返回相同的“é”。然后使用PHP json_decode(),如果找到“é”,它将失败,因此对于Firefox,Opera,Safari和Chrome,我必须在json_decode()之前调用utf8_encode()。注意:在我的测试中,IE和Firefox使用的是本机JSON对象,其他浏览器使用的是json2.js。

慕少森

ASCII不再存在。使用UTF-8编码意味着您没有使用ASCII编码。您应该使用转义机制的是RFC所说的:除必须转义的字符外,所有Unicode字符都可以放在引号内:引号,反斜线和控制字符(U + 0000至U + 001F)
打开App,查看更多内容
随时随地看视频慕课网APP