浏览器如何决定在发送请求时使用哪个字符集?我们该如何应对呢?

时间:2014-11-04 10:01:14

标签: http encoding user-agent

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没有关于编码的“先验”信息。 如何决定选择哪种编码?

HTTP“前导码”和标题

只是将此作为参考

URI在2005年之后定义明确(参见RFC3986),并且应该使用UTF-8。在此之前,没有定义标准,这有点猜测。

标题值已在RFC5987中明确定义。


参考文献:

  • 超文本传输​​协议(HTTP)标头字段参数的字符集和语言编码 - RFC5987
  • 超文本传输​​协议(HTTP)中Content-Disposition标头字段的使用附录C - RFC6266
  • HTML表单元素(enctype
  • 统一资源标识符(URI):通用语法 - RFC3986

1 个答案:

答案 0 :(得分:1)

4.10.22.5, Selecting a form submission encoding节中介绍了用户代理为html 5表单提交选择编码的过程。

如果表单上没有(有效)accept-charset元素,则默认为UTF-8。

html 4 it is

  

[accept-charset]属性的默认值是保留字符串“UNKNOWN”。用户代理可以将此值解释为用于传输包含此FORM元素的文档的字符编码。