更新请求:是否有任何;“最佳做法”;用于通信POST-to REST服务的编码?

更新请求:是否有任何;“最佳做法”;用于通信POST-to REST服务的编码?,rest,character-encoding,Rest,Character Encoding,我正在创建一个RESTful服务,其中客户端可能发布一些XML、JSON或一些非结构化文本。可以想象,客户可以发布中文字符等。有一个问题几乎是一样的,但它已经四年了,我想看看是否有任何“最佳实践”结合在一起 编辑:这不是针对从表单(网页)发布的信息,而是针对客户端应用程序,因此POST请求的内容类型将是text/xml、text/plain,可能还有application/json。对于xml和json,最佳做法是始终使用UTF-8编码。如果您确实不能使用UTF-8,XML具有针对不同字符集的机

我正在创建一个RESTful服务,其中客户端可能发布一些XML、JSON或一些非结构化文本。可以想象,客户可以发布中文字符等。有一个问题几乎是一样的,但它已经四年了,我想看看是否有任何“最佳实践”结合在一起


编辑:这不是针对从表单(网页)发布的信息,而是针对客户端应用程序,因此POST请求的内容类型将是text/xml、text/plain,可能还有application/json。

对于xml和json,最佳做法是始终使用UTF-8编码。如果您确实不能使用UTF-8,XML具有针对不同字符集的机制,首先是给定给mimetype的charset参数,然后是
XML
指令的charset参数。

由于嵌入了百分比编码,www表单POST的字符集始终是ASCII,因此,
application/x-www-form-urlencoded
charset
声明是不必要的。事实上,为这种MIME类型指定字符集是非常困难的

因此,从以下方面:

0x6b65793d76254333254134254333254241254333254142
进入:

由于ASCII兼容性,使用几乎任何编码都会起到相同的作用

您可能会注意到数据仍然是编码的。请求
内容类型
charset
参数仅适用于发送的即时二进制文件(“将八位字节序列转换为字符序列”,如中所述),适用于将
key=v%C3%A4%C3%BA%C3%a
转换为
key=väë
的机制,这实际上涉及到将字符转换成其他字符

html4中的application/x-www-form-urlencoded方案“规范”是非常无用的,但是。百分比编码的最终默认编码是UTF-8,编码名称在
\u charset\u
魔术参数(如果可用)中传输

所以是的,仍然没有一种好的、使用正式的方式(内容类型中的
charset
是无效的、错误的和被误解的)来声明嵌入百分比编码的字符编码。在实践中,我只会使用UTF-8,因为这是一个非常严格的方案,当它失败时,可以回到ISO-8859-1



对于JSON,使用UTF-8/16/32之外的任何其他编码都是无效的,到处都假定使用UTF-8。对于XML,您可以读取内容类型标题,回退到
编码
属性,最终您必须回退到UTF-8,如果它不计算,则声明无效。

有趣的是,我正在用一个简单的网页和一些ajax调用测试我的服务。为了好玩,我尝试设置ajax请求的内容类型头的字符集。在Chrome中,如果我将其设置为UTF-8以外的值,Chrome会将其更改为UTF-8-我可以在服务器上的请求头中看到它!如果我在IE中设置它,它会将它发送到我的服务器。另一个有趣的注意事项:在C#/asp.net中,HttpRequest.ContentEncoding被设置为这个值(请求的字符集,如Content Type header中指定的)。谢谢,这是一些有趣的东西,但是发布到我的服务的客户机将发送具有mime类型text/xml、text/plain和可能的application/json的数据。@Aerik Oh。你链接的帖子与当时的情况完全无关,我想纠正那里发布的错误观念。如果有帮助的话,我有一些关于这些类型的小片段<代码>应用程序/x-www-form-urlencoded
不必来自浏览器,顺便说一句。
key=v%C3%A4%C3%BA%C3%A