最近,我遇到了一些与使用POST方法进行的AJAX调用的字符编码相关的非常奇怪的行为。 长话短说,我有一个带有文本字段的HTML表单,可以接受变音符号(例如“ä”)。提交表单时,表单数据将包装在XML块中并发送到服务器,服务器将该信息存储在MySQL数据库中。随后,从数据库中检索该信息并按原样显示给普通用户。
如果请求是从Chrome或IE发送的,那么一切都很好。这意味着包括变音符号在内的数据被发送,存储,然后检索并正确显示。但是,当我使用Firefox时,XML似乎正确地提交表单数据,但是当我重新加载网页时,之前发送的变音符号不会出现。换句话说,他们似乎在途中迷失了方向。 例如,如果XML包含单词“tästä”,当我加载页面时,我看到“ tst ”。
为什么会这样? Firefox对邮件消息的编码方式与IE和Chrome不同吗?
如果它有帮助,我已经附加了Chrome和Firefox的请求和响应标题,用于完全相同的表单内容 - 只有一个示例:
顺便说一下,我没有在将数据发送到服务器之前对数据进行编码,只是简单地检索表单字段的值。
的反转片: 的
XML数据块:
<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>
请求标头:
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:562
Content-Type:application/x-www-form-urlencoded
Cookie:PHPSESSID=rlne2d787j0np52ec5rtn04dm1
Host:83.150.87.220
Origin:http://hidden.by.me
Referer:http://http://hidden.by.me/?c=2094211
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1
X-Requested-With:XMLHttpRequest
回复标题:
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:application/xml
Date:Mon, 17 Sep 2012 16:21:58 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.11 (Win32) PHP/5.2.9-1
Transfer-Encoding:chunked
Vary:Accept-Encoding
的 FIREFOX: 的
XML数据块:
<request>
<session>{hidden by me}</session>
<builder>Hem i Stan tästä</builder>
</request>
请求标头:
Accept */*
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection keep-alive
Content-Length 562
Content-Type application/x-www-form-urlencoded; charset=UTF-8
Cookie PHPSESSID=kvfg4fp2trorllim19dmn241c7
Host hidden.by.me
Referer http://hidden.by.me/?c=2094211
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1
X-Requested-With XMLHttpRequest
回复标题:
Connection Keep-Alive
Content-Encoding gzip
Content-Type application/xml
Date Mon, 17 Sep 2012 16:21:23 GMT
Keep-Alive timeout=5, max=100
Server Apache/2.2.11 (Win32) PHP/5.2.9-1
Transfer-Encoding chunked
Vary Accept-Encoding
答案 0 :(得分:5)
正如@Pointy前面提到的那样,问题与Content-Type
请求的POST
有关,因为Firefox似乎对POST
个消息的编码方式与其他浏览器不同。
在我看来,Data-Type
和Content-Type
是相同的,因此,我没有意识到在两种情况下都必须指定UTF-8
作为字符编码标准。但是,一旦我将Content-Type
和Data-Type
同时更改为明确的“text / xml; charset = UTF-8”,问题就解决了。
答案 1 :(得分:1)
我太开心了。谢谢你们发布并早些解决这个问题。我花了几个小时来接近问题,通过谷歌搜索来找到这个,但是由于你的评论,我在不到一天的时间里解决了这个问题。及时赶上明天的大型演讲! :)
很奇怪,看到所有浏览器都在AJAX请求中发送相同的数据字符串但得到的结果不同,具体取决于浏览器(Firefox不同。)
我尝试了这个,但它不起作用:
req.setRequestHeader(“encoding”,“utf-8”);
然后我就完成了你所说的Firefox所做的事情,并且一种编码解决方案适用于所有浏览器。
req.setRequestHeader(“Content-type”,“application / x-www-form-urlencoded; charset = utf-8”);
我已经在Chrome,MSIE,Firefox,Safari,Opera和Opera Next上进行了测试。每次都有效!