如果页面设置的编码格式不是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)
就可以把字符串反解码了
当你还在被编码弄得头昏脑胀的时候 试试这个吧