针对jquery.form.js 3.01版本提交中文数据时出现的乱码问题,通过分析源码发现fieldValue函数返回原始值。解决方法是在该处使用escape()对客户端数据进行编码,并在服务器端使用Server.UrlDecode()解码,从而正确接收中文字符。
jquery.form.js 3.01版中文乱码问题分析
网上搜索到的许多方法可能因使用的jquery.form.js为3.01版(即今年3月6日发布的版本)而无效。尽管未考证低版本是否适用,但多数方案仅是复制粘贴,缺乏实际效果。另有方法建议在提交前对所有值进行编码,但这会增加前端代码量,过于繁琐,因此未予采用。
定位ajaxSubmit函数源码
决定自行解决此问题。首先需找到切入点,即解决问题的入口。既然需要对JS传递的数据进行编码,应从数据传递函数入手。此处调用的是ajaxSubmit函数。打开js文件找到该函数并查看源码,发现其中有一行关键代码。
代码如下:
var qx, a = this.formToArray(options.semantic); formToArray函数的作用是将采集到的表单数据转换为对象数组,随后传递给$.get、$.post等Ajax函数。这一步骤表明此处可能存在处理空间。尽管后续代码长达数百行,为节省时间,直接深入核心部分。在上述代码行设置断点,在Web页面输入中文数据,通过JS逐步调试以理解源码逻辑。程序执行后,经过多次跳转,最终在fieldValue函数的末尾部分找到了关键位置。
代码如下:
return $(el).val(); 修改fieldValue函数进行编码
因此,只需在此处进行客户端编码即可解决问题。
代码如下:
return escape($(el).val()); 随后在服务器端,可以使用Server.UrlDecode()进行解码操作。这样即可消除乱码现象,正确接收中文字符。
如果您有其他更好的方法或建议,欢迎提出讨论。