tl; dr:当浏览器/用户代理提交表单时,它会以UTF-8(在我的测试中)提交,但不会在HTTP请求中包含该信息。用户代理如何决定使用UTF-8?应用程序代码(接收请求的代码)应该如何决定使用哪个字符集来解码传入数据?
在过去的几天里,我一直在互联网上挖掘,以了解从浏览器发送到网络服务器时数据的编码方式。事实证明这件事并非易事,因为在这个问题上没有明确的标准。
RFC2616(HTTP)主要基于ISO-8859-1和US-ASCII。但是存在扩展以允许其他字符集(例如RFC2047)。 编辑: RFC2616已被RFC7231废弃,后者已删除了有关ISO-8859-1的注释(请参阅Appendix B)
基本上,当用户代理发送包含正文的请求时,问题似乎已明确定义:使用包含Content-Type
参数的charset
标头。例如:
Content-Type: text/plain; charset=utf-8
使用JavaScript很容易。但是今天,我遇到了一个问题,即在使用HTML Form元素时无法指定charset。在搜索中,我遇到this SO question,但在我看来,答案是不正确的。它声称使用accept-charset
属性。但是从the reference开始,此标头用于告诉服务器客户端/用户代理可以接受哪些字符集。不是相反。
相关的FORM属性enctype
指定提交的文档的内容类型。但它只允许三个值,如果它们不按原样使用,则用户代理(在本例中为Chrome)默认为application/x-www-form-urlencoded
。你不能指定一个字符集,这在我看来是好的,因为UA的工作就是为你编码。
但结果是,到达服务器的请求完全没有关于使用的字符集的任何信息。那么应用程序代码如何决定使用哪种编码?
另一个问题是: 用户代理如何决定在提交表单时使用哪个字符集?在我的所有测试中,他们都将其作为UTF-8提交。但这是从哪里来的?嗅探网络流量并没有表明这可能来自哪里。虽然,原始网页包含一个元标记,表示该页面是UTF-8。是吗?
我假设 UA正在使用与从服务器收到的字符集相同的字符集。但是如果它从应用程序A请求的页面(在UTF-8中)包含一个对应用程序B执行POST操作的表单。假设这是完全可能的(同源策略仅适用于XHRIO吗?)...那种情况下,UA没有关于编码的“先验”信息。 如何决定选择哪种编码?
只是将此作为参考
URI在2005年之后定义明确(参见RFC3986),并且应该使用UTF-8。在此之前,没有定义标准,这有点猜测。
标题值已在RFC5987中明确定义。
参考文献:
答案 0 :(得分:1)
第4.10.22.5, Selecting a form submission encoding节中介绍了用户代理为html 5表单提交选择编码的过程。
如果表单上没有(有效)accept-charset
元素,则默认为UTF-8。
[
accept-charset
]属性的默认值是保留字符串“UNKNOWN”。用户代理可以将此值解释为用于传输包含此FORM元素的文档的字符编码。