【问题标题】:Detecting the character encoding of an HTTP POST request检测 HTTP POST 请求的字符编码
【发布时间】:2010-10-17 01:44:34
【问题描述】:

我正在构建一个 Web 服务,并且有一个接受 POST 以创建新资源的节点。该资源需要两种内容类型之一 - 我将定义的 XML 格式或表单编码变量。

这个想法是消费应用程序可以直接发布 XML 并从更好的验证等中受益,但也有一个 HTML 界面可以发布表单编码的内容。显然 XML 格式有一个 charset 声明,但我看不到我如何仅通过查看 POST 来检测表单的 charset。

从 Firefox 到表单的典型帖子如下所示:

POST /path HTTP/1.1
Host: www.myhostname.com
User-Agent: Mozilla/5.0 [...etc...]
Accept: text/html,application/xhtml+xml, [...etc...]
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 41

field1=value1&field2=value2&field3=value3

其中似乎没有包含任何有用的字符集指示。

据我所知,application/x-www-form-urlencoded 类型完全是在 HTML 中定义的,它只是列出了 %-encoding 规则,但没有说明数据应该在什么字符集中.

基本上,如果我不知道 HTML 最初呈现的字符集是什么,有什么方法可以告诉字符集?否则,我将不得不尝试根据存在的字符来猜测字符集,而我所知道的总是有点不确定。

【问题讨论】:

  • 这里有很多细微之处,行为会因浏览器和操作系统而异。 IE 使用的一种约定是,如果您有一个名为 _charset_ 的隐藏输入,IE 将使用它在提交表单时使用的字符集填充该字段。另见相关问题stackoverflow.com/questions/12830546/…

标签: http rest http-headers


【解决方案1】:

在 POST 中使用的字符集将与托管表单的 HTML 中指定的字符集相匹配。因此,如果您的表单是使用 UTF-8 编码发送的,则该编码是用于发布内容的编码。在将值转换为字符编码的八位字节集后应用 URL 编码。

【讨论】:

  • 我更想知道是否有一种无状态的方法来处理它,就像不知道表单的字符集一样。
  • 没有。客户端必须在 HTTP 标头中显式声明字符集才能正常工作。
  • @CiaranMcNulty 这实际上不是真的,有些浏览器不这样做。我在FF上试过这个,强制页面字符集为iso-8859-1,它仍然以UTF-8提交表单
【解决方案2】:

HTTP POST 的默认编码是 ISO-8859-1。

否则,您必须查看 Content-Type 标头,然后看起来像

Content-Type: application/x-www-form-urlencoded ; charset=UTF-8

你可以用

声明你的表单
<form enctype="application/x-www-form-urlencoded;charset=UTF-8">

<form accept-charset="UTF-8">

强制编码。

一些参考资料:

http://www.htmlhelp.com/reference/html40/forms/form.html

http://www.w3schools.com/tags/tag_form.asp

【讨论】:

  • 好吧,我不知道,我不是 Web 开发人员,我已经添加了链接,您可以在其中找到一些参考资料。
  • 几年前我在 Safari 和 Firefox 上测试了默认的表单编码,发现它们总是返回 UTF-8。没有在IE上测试。我应该补充一点,带有表单的页面是 UTF-8 格式的。
  • 我还应该补充一点,这似乎违反了 HTTP 标准(请参阅 w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.4.1 )。我正在使用 Tomcat,它声称客户端没有在其标头中指定字符集。 (我信任 Tomcat,但无法验证它实际上是否正确读取了标头。)
  • 另一件事:HTML4 的默认表单格式是“未知”,即使用页面的格式。这里的问题是浏览器拒绝在 POST 中指定字符集。 (见w3.org/TR/html4/interact/forms.html#h-17.3
  • @chburd:顺便说一句,这在 FireFox 上不起作用。它只是忽略 enctype 属性中的字符集,并以它想要的形式发布(似乎是 UTF-8)。
【解决方案3】:

尝试在您的 Content-Type 上设置字符集:

httpCon.setRequestProperty( "Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary );

【讨论】:

  • 如果你有多个容器,你可以在它们之间传递一个唯一的边界字符串。
猜你喜欢
  • 1970-01-01
  • 2015-05-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多