解决不同编码,不同语言间传递数据乱码的通用办法

有时候我们在使用ajax传递数据的时候总是碰到中文乱码问题,如果各页面,前后台之间传递的编码都是UTF-8那倒还好处理,万一不都是UTF-8呢? 
下面提供通用的办法,可以解决中文,日文,韩文等语言乱码问题 
Java代码 
  1. //从数据库查出所有对象  
  2. List list= service.getList(tableName);  
  3. //将list传递到下个界面  
  4. session.setAttribute("list", list);  

获得传下来的数据,依次填入option,注意option的value值是name编码后的值,这样value值就不会是中文的了,这里使用的是velocity语法! 
Html代码 
  1. #set($list= $session.getAttribute("list"))  
  2. <select align="center" name=""  id="selection">  
  3.         <option value="" >&nbsp;</option>  
  4.         #if ($list)  
  5.             #foreach($oneInList in $list)  
  6.                <option value="$oneInList.getName_encode()" >$oneInList.getName()</option>  
  7.            #end  
  8.         #end  
  9. </select>  
  10. <input id="sendButton" type="button" value="发送" class="btnCmd" />  

上面有个方法getName_encoded()是把name编码后的数据,在list的实体类中被实现,看下面代码片段: 
Java代码 
  1. private String name;  
  2. public String getName() {  
  3.     return name;  
  4. }  
  5. public String getName_encode() {  
  6.     return StringUtil.HexEncode(name);  
  7. }  


获得选择得到的值(注意是编码后的值),然后发起ajax请求到后台处理 
Html代码 
  1. jQuery("#sendButton").click(function() {  
  2.     var name_encoded=jQuery("#selection").find("option:selected").val();  
  3.     jQuery.ajax({  
  4.         dataType: "text",  
  5.         type:'POST',  
  6.         url: sendurl,  
  7.         data: encodeURI('name_encoded='+name_encoded),//实际上这里的encodeURI可以不用了,因为name_encoded是编码后的值,不可能是中文的了  
  8.         success:function(msg){  
  9.                    //这里处理从后台传回来的数据  
  10.             alert(msg);  
  11.                         },  
  12.         error:function(msg){  
  13.             alert("msg="+msg);  
  14.                         }  
  15.         });  
  16.       });  

后台接受到编码了的数据,然后反编码,数据变回中文的了 
Java代码 
  1. String name_encoded = request.getParameter("name_encoded");  
  2. String name_decode= StringUtil.HexDecode(name_encoded);//已经是中文了  
  3. //这里处理name_decode后得到sendData,发送到前台  
  4. requestgetWriter().write(sendData);  
  5. requestgetWriter().flush();  
  6. requestgetWriter().close();  


利用这种办法可以解决中文乱码问题。其实原理很简单,就是在传到页面之前先用HexEncode方法把中文编码掉,这样就不会传过去中文了,然后再把编码后的数据传到后台用HexDecode方法反编码,这样又恢复中文了。 
下面提供HexEncode和HexDecode方法,我把他们放在了StringUtil类中: 
Java代码 
  1. /** 
  2.      * Encode string to hex string, hex string can use in url 
  3.      * @param str 
  4.      * @return hex string 
  5.      */  
  6.     public static String HexEncode(String str) {  
  7.         String hexString = null;  
  8.         if (str != null && str.length() > 0) {  
  9.             char[] digital = "0123456789ABCDEF".toCharArray();  
  10.             StringBuffer sb = new StringBuffer("");  
  11.             try {  
  12.                 byte[] bs = str.getBytes("utf-8");  
  13.                 int bit;  
  14.                 for (int i = 0; i < bs.length; i++) {  
  15.                     bit = (bs[i] & 0x0f0) >> 4;  
  16.                     sb.append(digital[bit]);  
  17.                     bit = bs[i] & 0x0f;  
  18.                     sb.append(digital[bit]);  
  19.                 }  
  20.             } catch(Exception e) {  
  21.             }  
  22.             hexString = sb.toString();  
  23.         }  
  24.           
  25.         return hexString;  
  26.     }  
  27.   
  28.     /** 
  29.      * Decode hex string 
  30.      * @param hexString 
  31.      * @return 
  32.      */  
  33.     public static String HexDecode(String hexString) {  
  34.         String str = null;  
  35.         if (hexString != null && hexString.length() > 0) {  
  36.             String digital = "0123456789ABCDEF";  
  37.             char[] hex2char = hexString.toCharArray();  
  38.             byte[] bytes = new byte[hexString.length() / 2];  
  39.             int temp;  
  40.             for (int i = 0; i < bytes.length; i++) {  
  41.                 temp = digital.indexOf(hex2char[2 * i]) * 16;  
  42.                 temp += digital.indexOf(hex2char[2 * i + 1]);  
  43.                 bytes[i] = (byte)(temp & 0xff);  
  44.             }  
  45.             try {  
  46.                 str = new String(bytes, "utf-8");  
  47.             } catch (Exception e) {  
  48.             }  
  49.         }  
  50.         return str;  
  51.     }  

ps:这些都是我在做对日外包中碰到的问题,因为项目中所有的页面都是 
<meta http-equiv="Content-type" content="text/html; charset=Shift_JIS"> 
编码!
转自: http://www.javaeye.com/topic/612756
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值