jquery提交中文导致乱码
2012-04-24 20:19
162 查看
按照需要,使用Jquery.Ajax方法来实现登录。但因为后台数据库是gbk,debug调试发现传送进来的总是以utf-8。
开始想到是不是apache的defaultcharset设置的问题。查看手册:
可见这里说的是应答内容的编码与这里无关。
请求的数据编码应该是由客户端完成的,form提交是没有问题的,它会根据
Content-Type:
application/x-www-form-urlencoded
也就是urlencoded编码。
根据那种字符进行编码应该是按照:
来做判断。
如老王的博客里面提到,实现form的编码和页面编码不一致采用的这种hack手段,可见form的data编码方式根据document.charset和accept-charset来指定。
对于一个应用两种编码他们的 Accept-Charset 是一致的,为什么服务器接收的编码就是不一样,区别在于document.charset不同。
document.charset
"UTF-8"
而这里的值,是浏览器根据 meta里面指定的值映射到自己的编码集来获取的。
但是,
当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。
当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端。
实际行为通常取决于用户浏览器的设置
编码处理也是有浏览器来完成。---NIH
好了。form的编码已经大概清楚了。而这里的问题是Jquery.Ajax方法提交的数据,根据多次测试发现,后台用mb_convert_encoding(,,$from='UTF-8')来做都是正确,换做其他就是错误。和奇怪,有木有。因此怀疑是Jquery搞的鬼。查看手册:
http://api.jquery.com/jQuery.ajax/
有这么一段
这个。。。。。
遂问题解决。对server端总是以from=utf8来做编码处理就可以了。
开始想到是不是apache的defaultcharset设置的问题。查看手册:
AddDefaultCharset 指令
说明 | 当应答内容是text/plain或 text/html时,在HTTP应答头中加入的默认字符集 |
---|---|
语法 | AddDefaultCharset On|Off|charset |
默认值 | AddDefaultCharset Off |
作用域 | server config, virtual host, directory, .htaccess |
覆盖项 | FileInfo |
状态 | 核心(C) |
模块 | core |
当且仅当应答内容是text/plain或text/html时,此指令将会在HTTP应答头中加入的默认字符集。理论上这将覆盖在文档体中通过<meta>标签指定的字符集,但是实际的行为通常取决于用户浏览器的设置。AddDefaultCharset Off 将会禁用此功能。AddDefaultCharset On 将启用Apache内部的默认字符集iso-8859-1 。您也可以指定使用在IANA注册过的字符集名字中的另外一个charset 。比如说: AddDefaultCharset utf-8 AddDefaultCharset只应当在如下情况下使用:所有文本资源都使用同一种确定的字符集,且分别标记他们的字符集非常麻烦。一个这样的例子是向包含动态内容的资源中添加字符集参数(比如先前遗留的CGI脚本),这样可能会因为在输出中包含用户提供的数据而导致跨站点脚本攻击。但是请注意:更好的解决办法是修改或删除这些脚本,因为设置了默认的字符集以后将会使得浏览器的字符集自动探测功能失效。 /article/2788278.html
可见这里说的是应答内容的编码与这里无关。
请求的数据编码应该是由客户端完成的,form提交是没有问题的,它会根据
Content-Type:
application/x-www-form-urlencoded
也就是urlencoded编码。
第一:需要URL encode的字符一般都是非ASCII的字符(笼统的讲),再通俗的讲就是除了英文字母以外的文字(如:中文,日文等)都要进行URL encode,所以对于我们来说,都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的; 第二:URL encode到底按照那种编码方式对字符编码?这里就是浏览器的事情了,而且不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,可能不同的用户就有不同的浏览器设置,也就造成不同的编码方式,所以很多网站的做法都是先把url里面的中文或特殊字符用javascript做URL encode,然后再拼接url提交数据,也就是替浏览器做了URL encode,好处就是网站可以统一get方法提交数据的编码方式。 完成了URL encode,那么现在的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。这里想多说几句的是,对于get方法来说,没有请求实体,含有数据的url都在请求头里面,之所以用URL encode,我个人觉的原因是:对于请求头来说最终都是要用iso-8859-1编码方式编码成二进制的101010.....的纯数据在互联网上传送,如果直接将含有中文等特殊字符做iso-8859-1编码会丢失信息,所以先做URL encode是有必要的。
根据那种字符进行编码应该是按照:
Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3
来做判断。
如老王的博客里面提到,实现form的编码和页面编码不一致采用的这种hack手段,可见form的data编码方式根据document.charset和accept-charset来指定。
对于一个应用两种编码他们的 Accept-Charset 是一致的,为什么服务器接收的编码就是不一样,区别在于document.charset不同。
document.charset "GBK"
document.charset
"UTF-8"
而这里的值,是浏览器根据 meta里面指定的值映射到自己的编码集来获取的。
但是,
当Apache不指定defaultcharset的时候,页面编码由页面自己的meta标签指定。
当Apache指定的时候,将忽略页面中的meta标签指定的编码. 但是容许脚本直接header编码方式给客户端。
实际行为通常取决于用户浏览器的设置
编码处理也是有浏览器来完成。---NIH
好了。form的编码已经大概清楚了。而这里的问题是Jquery.Ajax方法提交的数据,根据多次测试发现,后台用mb_convert_encoding(,,$from='UTF-8')来做都是正确,换做其他就是错误。和奇怪,有木有。因此怀疑是Jquery搞的鬼。查看手册:
http://api.jquery.com/jQuery.ajax/
有这么一段
contentTypeString Default: 'application/x-www-form-urlencoded' When sending data to the server, use this content-type. Default is "application/x-www-form-urlencoded", which is fine for most cases. If you explicitly pass in a content-type to $.ajax() then it'll always be sent to the server (even if no data is sent). Data will always be transmitted to the server using UTF-8 charset; you must decode this appropriately on the server side.
这个。。。。。
遂问题解决。对server端总是以from=utf8来做编码处理就可以了。
相关文章推荐
- C(.net)中使用jQuery的POST方法提交中文乱码的处理
- jquery的serialize和getJson导致中文乱码的案例学习
- 含有中文字符的json对象通过jquery提交到mongoose web的乱码问题
- 修改jQuery.Autocomplete插件 支持中文输入法 避免TAB、ENTER键失效、导致表单提交
- jQuery.form.js进行表单提交,中文乱码问题及解决
- JQuery ajaxSubmit提交中文乱码的解决方案
- JQuery中Ajax的Post提交中文乱码的解决方案
- JQuery中Ajax的Post提交在IE下中文乱码的解决方法
- JQuery ajaxSubmit提交中文乱码的解决方案
- Java CMS提交内容中带中文导致乱码修改jdbc连接字符串来解决的方法
- JQuery中Ajax的Post提交中文乱码的解决方案
- Asp中使用JQuery的AJAX提交中文乱码解决方法
- jquery.form 提交中文时乱码(GBK 乱码)的解决方案
- 页面编码为GBK时 jquery 提交ajax数据完美解决"中文乱码"方案
- 解决用jquery的get或者post提交方式提交到struts2中的action中文乱码问题
- 用jquery提交AJAX的中文乱码问题
- 页面编码为GBK时_jquery_提交ajax数据完美解决中文乱码方案
- jQuery.ajax提交GB2312或GBK编码中文乱码问题
- Asp中使用JQuery的AJAX提交中文乱码解决方法
- jquery表单提交到struts2中文乱码