检测HTTP POST请求的字符编码

Cia*_*lty 53 rest http http-headers

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

这个想法是消费应用程序可以直接POST XML并从更好的验证等方面受益,但是还有一个HTML接口将POST表单编码的东西.显然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
Run Code Online (Sandbox Code Playgroud)

这似乎不包含任何有用的字符集指示.

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

基本上,如果我不知道HTML最初呈现的字符集,有没有办法告诉字符集?否则,我将不得不尝试根据字符存在来猜测字符集,而且总是有点不确定.

chb*_*urd 64

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

否则你必须看看那样的Content-Type标题

Content-Type: application/x-www-form-urlencoded ; charset=UTF-8
Run Code Online (Sandbox Code Playgroud)

你也许可以申报表格

<form enctype="application/x-www-form-urlencoded;charset=UTF-8">
Run Code Online (Sandbox Code Playgroud)

要么

<form accept-charset="UTF-8">
Run Code Online (Sandbox Code Playgroud)

强制编码.

一些参考:

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

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


Ant*_*nes 10

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

  • @CiaranMcNulty实际上不是真的,有些浏览器不这样做.我在FF上尝试了这个,强制页面字符集为iso-8859-1,它仍然以UTF-8提交表单 (2认同)