日期:2014-05-16 浏览次数:20654 次
有运营同学反映,后台编辑的一个中文显示名称,前台乱码了,于是乎~~
先看代码是否get请求没转码:
$.ajax({ type: 'POST', url: '/admin/updatedisplayname}', data: {displayName:displayName}, success: function(res){ alert(1); }, error: function() { alert(2); }, dataType: 'json' })
奇怪~
问了下,对方用的是谷歌,检查他的浏览器编码有没特殊设置过,没有,一切正常。
纳闷,回来在谷歌测试下,晕死,果然重现,乱码了,哈哈,那就好办,查~
看看请求头信息啥的,发现使用$.ajax请求的时候有一个值有问题
chrome:contentType: 'application/x-www-form-urlencoded'
ff:contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
难道是这个在作祟,如果乎~
$.ajax({ type: 'POST', url: '/admin/updatedisplayname}', data: {displayName:displayName}, contentType: 'application/x-www-form-urlencoded; charset=UTF-8', success: function(res){ alert(1); }, error: function() { alert(2); }, dataType: 'json' })
莫不是有啥玄机,查看jquery手册
(默认: "application/x-www-form-urlencoded") 发送信息至服务器时内容编码类型。默认值适合大多数情况。如果你明确地传递了一个content-type给 $.ajax() 那么他必定会发送给服务器(即使没有数据要发送)
为毛我在不传入这个值的时候,火狐会加上 charset=UTF-8呢?
看看jquery源码:
ajaxSettings: { url: location.href, global: true, type: "GET", contentType: "application/x-www-form-urlencoded", processData: true, async: true, /* timeout: 0, data: null, username: null, password: null, traditional: false, */ // Create the request object; Microsoft failed to properly // implement the XMLHttpRequest in IE7 (can't request local files), // so we use the ActiveXObject when it is available // This function can be overriden by calling jQuery.ajaxSetup xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ? function() { return new window.XMLHttpRequest(); } : function() { try { return new window.ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} }, accepts: { xml: "application/xml, text/xml", html: "text/html", script: "text/javascript, application/javascript", json: "application/json, text/javascript", text: "text/plain", _default: "*/*" } },
contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
不过,又有问题,有同学没有加,但是测试是ok的,谷歌不乱码,各种不淡定啊。。。。
再查~
首先想到检查jquery版本,果然,这哥们是用jquery1.7.2,而我用的是1.4.2,查看1.7.2的源码:
ajaxSettings: { url: ajaxLocation, isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ), global: true, type: "GET", contentType: "application/x-www-form-urlencoded; charset=UTF-8", processData: true, async: true, /* timeout: 0, data: null, dataType: null, username: null, password: null, cache: null, traditional: false, headers: {}, */ accepts: { xml: "application/xml, text/xml", html: "text/ht