乱码问题

一,在web开发中,比较常遇到的就是get post乱码问题

解决方案:

1,get请求时,参数会得到乱码主要原因取决与当前浏览器的页面是怎么编码,如假设是UTF-8编码,在浏览器地址栏请求时,浏览器会对url进行URLEncoder.encode(url, "utf-8")进行编码,然后相对应的服务器,会根据后台配置

如:tomcat

 

 

Java代码   收藏代码
  1. <Connector port="8080" maxThread="50" minSpareThreads="25" maxSpareThread="75"   
  2. enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"   
  3. connectionTimeout="20000" disableUploadTimeout="true"   URIEncoding="utf-8"/>  
Java代码   收藏代码
  1.   

 进行相应的decode而达到编码的一致性,所以如果两者不一致,就会出现乱码问题

 

     2,post请求,只要写个对应的过滤器,就可解决乱码问题

 

Java代码   收藏代码
  1. if (this.encoding != null && request.getCharacterEncoding() == null){  
  2.               
  3.     request.setCharacterEncoding(this.encoding);  
  4. }  
  5.           
  6. filterChain.doFilter(request, response);  
 

二,要解决乱码问题,就要达到一整个流程用的都是统一编码,

    1,从页面开始,设置content-type告诉浏览器用怎么编码进行查看

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

 

   2,进入后台操作时有有相应的以上get post的请求设置,获取参数一般不会出现乱码 ,而后在返回值时,

response.setContentType("text/html;charset=utf-8");告诉浏览器用怎么进行编码查看响应值

 

三,问题汇总:

 

   1,在开发17173搜索时,由于旧的搜索用的是GBK编码,故其他17173系统在调用搜索数据以及搜索时都是用GBK进行查找。

   2,新的搜索采用的是UTF-8编码,故就不兼容旧的其他的系统的查找。解决方案是重新对旧系统进行规划,把其他系统搜索过来的数据用一套GBK编码的格式的页面进行接收keyword,然后对keyword=URLEncoder.encode(keyword, "utf-8");进行编码,再跳转到utf-8的页面去,进行兼容

 

  3,new String(keyword.getBytes("UTF-8"),"GBK")时,遇到两个字的中文字可以进行强制编码成功,三个字的中文字会出现乱码

 

 

Java代码   收藏代码
  1. public static void main(String[] args) throws UnsupportedEncodingException {  
  2.         // 给定某3个汉字  
  3.         String src = "你好啊";  
  4.         //String src="一二三";  
  5.         // 浏览器进行gbk编码,并传送到服务器  
  6.         byte[] bytes1 = src.getBytes("utf-8");  
  7.         System.out.println(bytes1.length);// 9  
  8.         for (int i = 0; i < bytes1.length; i++) {  
  9.             System.out.print(bytes1[i] & 0xff);  
  10.             System.out.print("\t");  
  11.         }  
  12.   
  13.         // tomcat以gbk方式解码(这个片段的说明仅针对gbk处理汉字的情况)  
  14.         // 如果一对汉字字节不符合gbk编码规范,则每个字节使用'?'(ascii 63)代替  
  15.         // 万幸的话,只是最后一个(第9个)字节因不能成对,变成问号(比如当src="你好啊"时)  
  16.         // 不幸的话,中间某些字节就通不过gbk编码规范出现'?'了(比如当src="一二三"时)  
  17.         // 总之temp的最后一位必定是问号'?'  
  18.         String temp = new String(bytes1, "gbk");  
  19.   
  20.         // 你的action中的代码  
  21.         // 由于以上的tomcat以gbk解释utf-8不能成功  
  22.         // 所以此时bytes2和bytes1不一样  
  23.         byte[] bytes2 = temp.getBytes("gbk");  
  24.         System.out.println(bytes2.length);  
  25.       
  26.         System.out.println();  
  27.         for (int i = 0; i < bytes2.length; i++) {  
  28.             System.out.print(bytes2[i] & 0xff);  
  29.             System.out.print("\t");  
  30.         }  
  31.         System.out.println();  
  32.   
  33.         // 构建出来的dest自然不是原先的src  
  34.         String dest = new String(bytes2, "utf-8");  
  35.         System.out.println(dest);  
  36.     }  

 

   4, 在编码未确定的情况下,要先检查该中文是属性于哪一种编码

 

 

Java代码   收藏代码
  1. public static String getEncoding(String str) {    
  2.     String encode = "ISO-8859-1";    
  3.     try {    
  4.         if (str.equals(new String(str.getBytes(encode), encode))) {    
  5.             String s1 = encode;    
  6.             return s1;    
  7.         }    
  8.     } catch (Exception exception1) {    
  9.     }    
  10.     encode = "UTF-8";  
  11.     try {    
  12.         if (str.equals(new String(str.getBytes(encode), encode))) {    
  13.             String s2 = encode;    
  14.             return s2;    
  15.         }    
  16.     } catch (Exception exception2) {    
  17.     }    
  18.     encode = "GBK";    
  19.     try {    
  20.         if (str.equals(new String(str.getBytes(encode), encode))) {    
  21.             String s3 = encode;    
  22.             return s3;    
  23.         }    
  24.     } catch (Exception exception3) {    
  25.     }    
  26.     return "";    
  27. }    

 然后根据对应的编码new String(str.getBytes(encode), encode)进行转换,而达到编码转换的目的

 

 

 

5,jdk系统编码,Charset.defaultCharset() 这个获取,而这个的信息就与eclipse页面右键属性中更改其编码方式

 

Java代码   收藏代码
  1. System.out.println(Charset.defaultCharset());    
  2.         String s="中国";  
  3. System.out.println(getEncoding(s));  
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值