本文详细解析了JavaScript中escape函数在Ajax传递中文时导致的乱码问题。由于新版JS采用Unicode编码,服务端无法直接获取参数。解决方案是对中文进行两次escape编码,并配合特定的Java工具类进行解码,从而确保数据正确传输。
Ajax中文乱码问题背景
本文通过具体实例介绍利用escape函数处理JavaScript中Ajax请求传递中文时产生的乱码问题,供读者参考学习。
一、问题背景:
早期的网页特效中,escape()函数使用iso-8859-1字符集对中文进行URL编码,此时在服务器端通过request.getparameter()可以直接获取请求参数。然而,后续版本的JavaScript将escape()改为使用Unicode字符集编码,导致在JSP和Servlet环境中无法直接获取到正确的请求参数,具体技术原因尚不明确。
双重escape编码解决方案
二、解决方案:
1. 对中文参数执行两次escape()编码。例如,若需传递参数name,值为“你好”,则构造的URL格式应为....name=escape(escape("你好"))。经过这种双重编码处理后,在服务器端通过request.getparameter()即可获取到编码后的参数值。
2. 解码处理:获取到的参数格式类似 %25u4f60%25u597d,常规的urldecoder.decode()无法直接解码。为此,需使用特定的工具类来实现与JavaScript中escape()及unescape()相匹配的编解码功能。
JavaScript实现代码示例
具体实现代码如下:
<script language="javascript">
function get(id){return document.getelementbyid(id).value}
function setting()
{
var xmlhttp;
if(window.activexobject)
{
xmlhttp=new activexobject("microsoft.xmlhttp")
}else{
xmlhttp=new xmlhttprequest();
}
xmlhttp.onreadystatechange=function()
{
if(xmlhttp.readystate==4)
{
if(xmlhttp.status==200)
{
alert("成功!")
}else{
alert(xmlhttp.status)
}
}
}
var url="action.asp教程?action=setting&rnd="+math.random()
xmlhttp.open("post",url,true)
var senddate ="title="+escape(get("title"))+"&conn_way="+escape(get("conn_way"))+"&databasename="+escape(get("databasename"))+"&sqlusername="+escape(get("sqlusername"))+"&sqlpassword="+escape(get("sqlpassword"))+"&sqllocalname="+escape(get("sqllocalname"))+"&pg_size="+escape(get("pg_size"))+"&adminid="+escape(get("adminid"))+"&adminpwd="+escape(get("adminpwd"));
2727 xmlhttp.setrequestheader('content-type','application/x-www-form-urlencoded');
xmlhttp.send(senddate)
}
</script>
escape函数语法详解
上述实例中仅使用了escape函数处理中文,其语法规范如下:
定义和用法: escape() 函数可对字符串进行编码,确保该字符串能在所有计算机上被正确读取。 语法:
escape(string)参数 描述 string 必需。需要被转义或编码的字符串。
返回值: 返回已编码的 string 副本,其中部分字符被替换为十六进制的转义序列。
说明: 该函数不对 ascii 字母和数字进行编码,也不对以下 ascii 标点符号进行编码: - _ . ! ~ * ' ( ) 。其余所有字符均会被转义序列替换。
提示和注释: 提示:可以使用 unescape() 对 escape() 编码的字符串进行解码。 注释:ecmascript v3 反对使用该方法,建议使用 decodeuri() 和 decodeuricomponent() 替代它。
希望本文所述内容能对大家的javascript程序设计有所帮助。