ajax/post/gb2312特殊字符出现乱码完美解决方法

来源:互联网 发布:log4j2 json 编辑:程序博客网 时间:2024/06/06 00:32

这里提供asp环境下采用gb2312编码,通过ajax技术的post发送方法提交数据时,对于特殊字符的乱码问题给予一个完美的解决方案——即发送数据利用encodeURIComponent和escape套接的方法——本实例经过测试,完全解决ajax关于在gb2312编码下post发送特殊符号所产生的乱码问题。

完整代码如下

[javascript] view plain copy
  1. <script>  
  2. var xmlhttp=getHTTPObject();  
  3. var post="大头爸爸测试字符www.asp163.org!@#$%^&*()_+|!·#¥%……—*()——+|§№☆★○●◎◇◆□〓↓↑←→※▲△■#&@\^_ ̄○㈡【】()[]{}〗〖";  
  4. xmlhttp.open('POST','more/file277/test.asp?random='+Math.random(), true);  
  5. xmlhttp.setrequestheader("content-length",post.length);  
  6. xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
  7. xmlhttp.onreadystatechange=function(){  
  8.   if (xmlhttp.readyState==4&&xmlhttp.status == 200){  
  9.     alert(xmlhttp.responseText);  
  10.     return true;  
  11.   }  
  12. }  
  13. xmlhttp.send("act="+encodeURIComponent(escape(post)));//encodeURIComponent和escape套接的方法  
  14.   
  15. function getHTTPObject(){  
  16.   if(typeof XMLHttpRequest!='undefined')  
  17.     return new XMLHttpRequest();  
  18.   try{  
  19.     return new ActiveXObject("Msxml2.XMLHTTP");  
  20.   }catch(e){  
  21.   try{  
  22.     return new ActiveXObject("Microsoft.XMLHTTP");  
  23.   }catch(e){}  
  24.   }  
  25.   return false;  
  26. }  
  27. </script>  

服务端测试代码如下(以ASP为例)

[vb] view plain copy
  1. <%  
  2. Response.CodePage=936  
  3. Response.Charset="gb2312"  
  4. Response.Write Unescape(Request("act"))  
  5. %>  

测试结果

[plain] view plain copy
  1. 大头爸爸测试字符www.asp163.org!@#$%^&*()_+|!·#¥%……—*()——+|§№☆★○●◎◇◆□〓↓↑←→※▲△■#&@\^_ ̄○㈡【】()[]{}〗〖  

测试结果:测试结果表明,采用本方法完全解决了asp/ajax/post/gb2312特殊字符出现乱码问题。

[javascript] view plain copy
  1. <script>    
  2. var xmlhttp=getHTTPObject();    
  3. var post="大头爸爸测试字符www.asp163.org!@#$%^&*()_+|!·#¥%……—*()——+|§№☆★○●◎◇◆□〓↓↑←→※▲△■#&@\^_ ̄○㈡【】()[]{}〗〖";    
  4. xmlhttp.open('POST','more/file277/test.asp?random='+Math.random(), true);    
  5. xmlhttp.setrequestheader("content-length",post.length);    
  6. xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");    
  7. xmlhttp.onreadystatechange=function(){    
  8.   if (xmlhttp.readyState==4&&xmlhttp.status == 200){    
  9.     alert(xmlhttp.responseText);    
  10.     return true;    
  11.   }    
  12. }    
  13. xmlhttp.send("act="+encodeURIComponent(escape(post)));//encodeURIComponent和escape套接的方法    
  14.   
  15. function getHTTPObject(){    
  16.   if(typeof XMLHttpRequest!='undefined')    
  17.     return new XMLHttpRequest();    
  18.   try{    
  19.     return new ActiveXObject("Msxml2.XMLHTTP");    
  20.   }catch(e){    
  21.   try{    
  22.     return new ActiveXObject("Microsoft.XMLHTTP");    
  23.   }catch(e){}    
  24.   }    
  25.   return false;    
  26. }  
  27. </script>  

另外在附带说明一下:

上面的方法中经测试符号“<”、“>”、“ ”(空格)、“回车换行”等符号是不被转换的,其它的符号,比如连接符(&)会转换为&amp;;单引号(')会转换为&#39;;双引号(")会转换为&quot等等。一般通过采用textarea表单来提供输入容器,因此如果提交的信息中不支持html的话——其实在一般场合是不能支持html代码的,因此要encodeURIComponent(escape(msg))无法编码的字符进行手工编码。还好这类编码字符并不多,我测试的这些字符有:<、>、空格、回车换行等。因此对这些字符需要做如下处理:

[javascript] view plain copy
  1. //文本: 格式化字符  
  2. //msg是收集的textarea内容  
  3. msg=msg.delSpace();  
  4. msg=msg.HtmlTextEncode();  
  5. msg=encodeURIComponent(escape(msg));  
  6.   
  7. //删除行末空格,删除文章结尾的空行、空格 ->写入到数据库  
  8. function String.prototype.delSpace(){  
  9.   var tmpstr=this;  
  10.   tmpstr=tmpstr.replace(/( )+\r/g,'\r');//删除行末空格  
  11.   tmpstr=tmpstr.replace(/[\r\n]+( )*[\r\n]*$/g,'');//删除文章结尾的空行、空格  
  12.   return tmpstr;  
  13. }  
  14.   
  15. //HTML部分代码转码 从TextArea写入到数据库  
  16. function String.prototype.HtmlTextEncode(){  
  17.   var tmpstr=this;  
  18.   tmpstr=tmpstr.replace(/</g,"<");//替换<号  
  19.   tmpstr=tmpstr.replace(/>/g,">");//替换>号  
  20.   tmpstr=tmpstr.replace(/\r\n/g,"<br\/>");//替换\n  
  21.   tmpstr=tmpstr.replace(/ /g," ");  
  22.   return tmpstr;  
  23. }  

测试一段代码

msg=msg.HtmlTextEncode();
msg=encodeURIComponent(escape(msg));//此行必须在上一行的下面

以上面代码测试符号<

执行完:msg=msg.HtmlTextEncode();后,msg的值为&lt;
执行完:msg=encodeURIComponent(escape(msg)); msg的值为%2526lt%253B
在后台:Response.Write Unescape(msg)取得的值为&lt;
存入数据库的值为:&lt;

同理,如果在textarea框中输入

[plain] view plain copy
  1. a  
  2. b  

存入数据库的值是

[html] view plain copy
  1. a<br/>b  

读取数据库前台显示的值是

[html] view plain copy
  1. a  
  2. b  

如果按下面顺序执行,同样测试符号<

执行完:msg=encodeURIComponent(escape(msg)); msg的值为%253C
执行完:msg=msg.HtmlTextEncode();后,msg的值为%253C
在后台:Response.Write Unescape(msg)取得的值为<
存入数据库的值为:<

同理,如果在textarea框中输入

[html] view plain copy
  1. a  
  2. b  

存入数据库的值是

[html] view plain copy
  1. a  
  2. b  

读取数据库前台显示的值是

[html] view plain copy
  1. a b  
0 0
原创粉丝点击