关于ajax中文乱码问题


 

 

如果页面设置的编码格式不是utf-8

那么中文就会出现乱码

这种问题大致解决方法都是改页面编码 改请求头charset

相信大家都试过很多 好用的不多 内部原理实在懒得看

来个简单的解决办法

首先处理ajax的请求数据

function getSubString()
{
var s="";
            var names=document.getElementsByTagName("input");
            var texts=document.getElementsByTagName("textarea");
            for(var i=0,l=names.length;i<l;i++)
            {
                if(names[i].name)
                    s+=names[i].name+"="+encodeURIComponent(names[i].value)+"&";
            }
            for(i=0,l=texts.length;i<l;i++)
            {    
                if(texts[i].name)
                    s+=texts[i].name+"="+encodeURIComponent(texts[i].innerText)+"&";
            }
            s+="time=123";
            s=s.replace(/%/g,"#");
            return s;
        }

encodeURIComponent会将String进行编码为%加十六进制的形式

服务端会解析这种格式 但是会是乱码

String s=requset.getParameter("");

s=new String(s.getBytes(),"utf-8");

大部分的时候 是好用的 注意只是大部分的时候 比如 传回去的是 "十一" 结果会正确

传回去的是 "一十一" 结果会变得很奇怪 第一个一丢了 我查看getBytes()返回的数据 第三位 变成了 63 这个是 '?' 啊

也就是说有些时候getBytes()返回的数据不对 我们自己写一个好了

 

那么阻止服务器自己解码 就把encodeURIComponent返回的%号替换成#

replace(/%/g,"#");

 

public String decodeUTF(String s) throws IOException
          {
              byte[] b=null;
                if(getISUTF(s))
                {
                    b=new byte[s.length()/3];
                    System.out.println(s);
                    System.out.println(s.length());
                    for(int i=0,j=0;i<s.length();i+=3,j++)
                    {
                        b[j]=getByte(s.charAt(i+1),s.charAt(i+2));
                    }
                    System.out.println(new String(b,"utf-8"));
                }
                else
                {
                    b=s.getBytes();
                }
                return new String(b,"utf-8");
          }
          public boolean getISUTF(String s)
          {
              if(s.length()%3!=0)
                  return false;
              for(int i=0;i<s.length();i+=3)
              {
                  if(s.charAt(i)!='#')
                      return false;
              }
            return true;
          }
          public byte getInt(char a)
          {
             switch(a)
             {
                 case '0':return (byte)0;
                 case '1':return (byte)1;
                 case '2':return (byte)2;
                 case '3':return (byte)3;
                 case '4':return (byte)4;
                 case '5':return (byte)5;
                 case '6':return (byte)6;
                 case '7':return (byte)7;
                 case '8':return (byte)8;
                 case '9':return (byte)9;
                 case 'A':return (byte)10;
                 case 'B':return (byte)11;
                 case 'C':return (byte)12;
                 case 'D':return (byte)13;
                 case 'E':return (byte)14;
                 case 'F':return (byte)15;
             }
            return -1;
          }
          public byte getByte(char a,char c)
          {
              byte b;
              b=(byte) (getInt(a)*16+getInt(c));
              return b;
          }

这样调用decodeUTF(String s)

就可以把字符串反解码了

 

 

当你还在被编码弄得头昏脑胀的时候 试试这个吧

转载于:https://www.cnblogs.com/HeiMan/archive/2012/10/19/2730822.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值