jquery提交中文导致乱码

按照需要,使用Jquery.Ajax方法来实现登录。但因为后台数据库是gbk,debug调试发现传送进来的总是以utf-8。

开始想到是不是apache的defaultcharset设置的问题。查看手册:

指令

说明当应答内容是text/plaintext/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脚本),这样可能会因为在输出中包含用户提供的数据而导致跨站点脚本攻击。但是请注意:更好的解决办法是修改或删除这些脚本,因为设置了默认的字符集以后将会使得浏览器的字符集自动探测功能失效。
http://blog.csdn.net/laruence/article/details/2301395

可见这里说的是应答内容的编码与这里无关。

请求的数据编码应该是由客户端完成的,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来做编码处理就可以了。