已完成
AJAX 输入验证 和
AJAX 数据管理器 。
在此基础上改为 jQuery 输入验证 和 jQuery 数据管理器 后,POST 方式提交出现乱码。
网上查的资料一边倒的说法是“在参数中添加 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 项”,尝试发现无效。
初步调查发现:
在服务器端用 request.getEncodingCharset() 均取到 null ,得以证实。
即:
检查服务器端程序,发现取参数的工具函数做了“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”编码转换后不乱码。
对服务器端取参数的工具函数做出如下改进:
问题解决。
如果不想大动干戈改 web.xml 或者 Filter 啥的,这样的工具函数就算是“广谱抗生素”了。
在此基础上改为 jQuery 输入验证 和 jQuery 数据管理器 后,POST 方式提交出现乱码。
网上查的资料一边倒的说法是“在参数中添加 contentType: "application/x-www-form-urlencoded; charset=UTF-8" 项”,尝试发现无效。
初步调查发现:
- 原有的 form GET 、POST 提交例子无乱码。
- 原有的 URL 提交例子无乱码。
- 原有的 AJAX GET 、POST 提交例子无乱码。
- jQuery AJAX GET 提交无乱码。
- jQuery AJAX POST 提交有乱码。
- jQuery 在 AJAX POST 时默认向 contentType 中添加了“charset=UTF-8”;
在服务器端用 request.getEncodingCharset() 取到“UTF-8”,得以证实。 - jQuery 在 AJAX GET 时不发送“charset=UTF-8”;
在服务器端用 request.getEncodingCharset() 取到 null ,得以证实。
在服务器端用 request.getEncodingCharset() 均取到 null ,得以证实。
即:
- 服务器未收到“charset=UTF-8”,无乱码。
- 服务器收到“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”编码转换后不乱码。
对服务器端取参数的工具函数做出如下改进:
- 发现 request 没有“charset”,做“ISO8859_1”→ 服务器端编码转换。
- 发现 request 有“charset”、但与服务器端编码不一致时,做编码转换。
- 发现 request 有“charset”、且与服务器端编码一致时,不做编码转换。
- 如果转换失败,即返回未经转换的参数。
问题解决。
如果不想大动干戈改 web.xml 或者 Filter 啥的,这样的工具函数就算是“广谱抗生素”了。
来源:oschina
链接:https://my.oschina.net/u/1394318/blog/206368