我正在构建一个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
似乎没有任何有用的字符集指示。
从我所看到的,application / x-www-form-urlencoded类型完全在HTML中定义,它只列出了%-encoding规则,但没有说明数据应该在什么字符集中。
基本上,如果我不知道HTML最初呈现的字符集,有没有办法告诉字符集?否则,我将不得不尝试根据字符的存在来猜测字符集,而且从我能说的话中总是有点不确定。
答案 0 :(得分:60)
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">
强制进行编码。
一些参考文献:
答案 1 :(得分:11)
POST中使用的Charset将匹配托管表单的HTML中指定的Charset。因此,如果您的表单是使用UTF-8编码发送的,该编码是用于发布内容的编码。在将值转换为字符编码的八位字节集后,将应用URL编码。
答案 2 :(得分:1)
尝试在内容类型上设置字符集:
httpCon.setRequestProperty( "Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary );