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

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

完整代码如下

[javascript] view plain copy
  1. <script>
  2. varxmlhttp=getHTTPObject();
  3. varpost="大头爸爸测试字符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. returntrue;
  11. }
  12. }
  13. xmlhttp.send("act="+encodeURIComponent(escape(post)));//encodeURIComponent和escape套接方法
  14. functiongetHTTPObject(){
  15. if(typeofXMLHttpRequest!='undefined')
  16. newXMLHttpRequest();
  17. try{
  18. newActiveXObject("Msxml2.XMLHTTP");
  19. }catch(e){
  20. try{
  21. newActiveXObject("Microsoft.XMLHTTP");
  22. }catch(e){}
  23. false;
  24. </script>

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

[vb] copy
    <%
  1. Response.CodePage=936
  2. Response.Charset="gb2312"
  3. Response.WriteUnescape(Request("act"))
  4. %>

测试结果

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

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

copy
    </script>

另外在附带说明一下:

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

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

测试一段代码

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框中输入

copy
    a
  1. b

存入数据库的值是

[html] copy
@H_890_502@ a<br/>b

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

copy
    b

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

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

同理,如果在textarea框中输入

copy
    copy
      b

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

    copy
    @H_890_502@ ab

相关文章

JS原生Ajax操作(XMLHttpRequest) GET请求 POST请求 兼容性问题 利用iframe模拟ajax 实现表单提交的返回...
AJAX 每日更新前端基础,如果觉得不错,点个star吧 &#128515; https://github.com/WindrunnerMax/E...
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSe...
很早就听闻ajax的名声,但是却一直不知道怎么用,今天自己捣鼓了一下,竟然会用了,哈哈哈哈。 为了防止...
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: &quot;./server/slider.js...
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var...