jQuery AJAX 乱码牵出的问题,及解决过程。

原创
2014/03/08 11:41
阅读数 557
已完成 AJAX 输入验证AJAX 数据管理器
在此基础上改为 jQuery 输入验证jQuery 数据管理器 后,POST 方式提交出现乱码。

网上查的资料一边倒的说法是“在参数中添加 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 项”,尝试发现无效。



初步调查发现:
  1. 原有的 form GET 、POST 提交例子无乱码。
  2. 原有的 URL 提交例子无乱码。
  3. 原有的 AJAX GET 、POST 提交例子无乱码。
  4. jQuery AJAX GET 提交无乱码。
  5. jQuery AJAX POST 提交有乱码。
经 Firebug 调试查得:
  1. jQuery 在 AJAX POST 时默认向 contentType 中添加了“charset=UTF-8”;
    在服务器端用 request.getEncodingCharset() 取到“UTF-8”,得以证实。
  2. jQuery 在 AJAX GET 时不发送“charset=UTF-8”;
    在服务器端用 request.getEncodingCharset() 取到 null ,得以证实。
再查资料和检查程序,发现原有的 form 提交例子、URL 提交例子和 AJAX 例子并不发送“charset=UTF-8”;
在服务器端用 request.getEncodingCharset() 取到 null ,得以证实。
即:
  1. 服务器未收到“charset=UTF-8”,无乱码。
  2. 服务器收到“charset=UTF-8”,乱码。
所以“在参数中添加 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 项”的办法无效。



检查服务器端程序,发现取参数的工具函数做了“ISO8859_1”→“UTF-8”编码转换——因为很早之前遇到过 request.getParameter("...") 乱码。
注释显示我最近一次修改这个工具函数在 2008 年 7 月 4 日。
当初编写这个工具函数时,只知道服务器端内部用的是“UTF-8”,并不知道 request 有“charset=UTF-8”这个梗;加上“ISO8859_1”→“UTF-8”编码转换后不再乱码,就没继续深究。
本次 jQuery AJAX POST 提交, 服务器端取到的参数已经是“UTF-8”编码,工具函数仍然不分青红皂白地做“ISO8859_1”→“UTF-8”编码转换,于是乱码了。

进一步试验,如果以“contentType: "application/x-www-form-urlencoded; charset=GB18030"”方式强制 jQuery AJAX POST 提交时用“GB18030”编码,服务器端 做“ISO8859_1”→“UTF-8”编码转换不做编码转换均乱码,但做“GB18030”→“UTF-8”编码转换后不乱码。

对服务器端取参数的工具函数做出如下改进:
  1. 发现 request 有“charset”,“ISO8859_1”→ 服务器端编码转换。
  2. 发现 request 有“charset”、但与服务器端编码一致时,做编码转换。
  3. 发现 request 有“charset”、且与服务器端编码一致时,做编码转换。
  4. 如果转换失败,即返回未经转换的参数。



问题解决。
如果不想大动干戈改 web.xml 或者 Filter 啥的,这样的工具函数就算是“广谱抗生素”了。
展开阅读全文
打赏
0
6 收藏
分享
加载中
更多评论
打赏
0 评论
6 收藏
0
分享
返回顶部
顶部