解决不同编码,不同语言间传递数据乱码的通用办法
2017-04-10 17:57
302 查看
有时候我们在使用ajax传递数据的时候总是碰到中文乱码问题,如果各页面,前后台之间传递的编码都是UTF-8那倒还好处理,万一不都是UTF-8呢?
下面提供通用的办法,可以解决中文,日文,韩文等语言乱码问题
获得传下来的数据,依次填入option,注意option的value值是name编码后的值,这样value值就不会是中文的了,这里使用的是velocity语法!
上面有个方法getName_encoded()是把name编码后的数据,在list的实体类中被实现,看下面代码片段:
获得选择得到的值(注意是编码后的值),然后发起ajax请求到后台处理
后台接受到编码了的数据,然后反编码,数据变回中文的了
利用这种办法可以解决中文乱码问题。其实原理很简单,就是在传到页面之前先用HexEncode方法把中文编码掉,这样就不会传过去中文了,然后再把编码后的数据传到后台用HexDecode方法反编码,这样又恢复中文了。
下面提供HexEncode和HexDecode方法,我把他们放在了StringUtil类中:
ps:这些都是我在做对日外包中碰到的问题,因为项目中所有的页面都是
<meta http-equiv="Content-type" content="text/html;charset=Shift_JIS">
编码!
下面提供通用的办法,可以解决中文,日文,韩文等语言乱码问题
//从数据库查出所有对象 List list= service.getList(tableName); //将list传递到下个界面 session.setAttribute("list", list);
获得传下来的数据,依次填入option,注意option的value值是name编码后的值,这样value值就不会是中文的了,这里使用的是velocity语法!
#set($list= $session.getAttribute("list")) <select align="center" name="" id="selection"> <option value="" > </option> #if ($list) #foreach($oneInList in $list) <option value="$oneInList.getName_encode()" >$oneInList.getName()</option> #end #end </select> <input id="sendButton" type="button" value="发送" class="btnCmd" />
上面有个方法getName_encoded()是把name编码后的数据,在list的实体类中被实现,看下面代码片段:
private String name; public String getName() { return name; } public String getName_encode() { return StringUtil.HexEncode(name); }
获得选择得到的值(注意是编码后的值),然后发起ajax请求到后台处理
jQuery("#sendButton").click(function() { var name_encoded=jQuery("#selection").find("option:selected").val(); jQuery.ajax({ dataType: "text", type:'POST', url: sendurl, data: encodeURI('name_encoded='+name_encoded),//实际上这里的encodeURI可以不用了,因为name_encoded是编码后的值,不可能是中文的了 success:function(msg){ //这里处理从后台传回来的数据 alert(msg); }, error:function(msg){ alert("msg="+msg); } }); });
后台接受到编码了的数据,然后反编码,数据变回中文的了
String name_encoded = request.getParameter("name_encoded"); String name_decode= StringUtil.HexDecode(name_encoded);//已经是中文了 //这里处理name_decode后得到sendData,发送到前台 requestgetWriter().write(sendData); requestgetWriter().flush(); requestgetWriter().close();
利用这种办法可以解决中文乱码问题。其实原理很简单,就是在传到页面之前先用HexEncode方法把中文编码掉,这样就不会传过去中文了,然后再把编码后的数据传到后台用HexDecode方法反编码,这样又恢复中文了。
下面提供HexEncode和HexDecode方法,我把他们放在了StringUtil类中:
/** * Encode string to hex string, hex string can use in url * @param str * @return hex string */ public static String HexEncode(String str) { String hexString = null; if (str != null && str.length() > 0) { char[] digital = "0123456789ABCDEF".toCharArray(); StringBuffer sb = new StringBuffer(""); try { byte[] bs = str.getBytes("utf-8"); int bit; for (int i = 0; i < bs.length; i++) { bit = (bs[i] & 0x0f0) >> 4; sb.append(digital[bit]); bit = bs[i] & 0x0f; sb.append(digital[bit]); } } catch(Exception e) { } hexString = sb.toString(); } return hexString; } /** * Decode hex string * @param hexString * @return */ public static String HexDecode(String hexString) { String str = null; if (hexString != null && hexString.length() > 0) { String digital = "0123456789ABCDEF"; char[] hex2char = hexString.toCharArray(); byte[] bytes = new byte[hexString.length() / 2]; int temp; for (int i = 0; i < bytes.length; i++) { temp = digital.indexOf(hex2char[2 * i]) * 16; temp += digital.indexOf(hex2char[2 * i + 1]); bytes[i] = (byte)(temp & 0xff); } try { str = new String(bytes, "utf-8"); } catch (Exception e) { } } return str; }
ps:这些都是我在做对日外包中碰到的问题,因为项目中所有的页面都是
<meta http-equiv="Content-type" content="text/html;charset=Shift_JIS">
编码!
相关文章推荐
- 解决不同编码,不同语言间传递数据乱码的通用办法
- 不同编码的页面表单数据乱码问题解决方法
- 客户端传递到服务器端后数据显示为乱码的解决办法
- 用form提交不同编码的数据及在IE下解决办法
- php 多语言(UTF-8编码)导出Excel、CSV乱码解决办法之导出UTF-8编码的Excel、CSV
- 不同编码的页面表单数据乱码问题解决方法
- android POST数据遇到的UTF-8编码(乱码)问题解决办法
- C#与SQL Server之间的数据类型对比及在VS2003+中空值传递的解决办法
- 因utf-8编码引起js输出中文乱码的解决办法
- PHP+AJAX传递数据方法一例。并带中文乱码解决方法
- 因utf-8编码引起js输出中文乱码的解决办法
- 因utf-8编码引起js输出中文乱码的解决办法
- 中文参数传递编码后传递乱码解决(java.net.URLEncoder.encode)
- C#与SQL Server之间的数据类型对比及在VS2003中空值传递的解决办法
- 使用JS生成文件 ,使用utf编码时,出现乱码的现象的解决办法
- ajax开发过程表单提交数据出现乱码和解决办法
- 在使用中文名导出数据到excel文件时文件名出现乱码的解决办法
- 用ajax传递中文时,有的计算机会出现乱码,我终于找到解决办法了。
- 解决多国语言乱码的编码问题
- 解决Javascript由于编码不同造成乱码的问题