您的位置:首页 > 其它

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

2017-04-10 17:57 302 查看
有时候我们在使用ajax传递数据的时候总是碰到中文乱码问题,如果各页面,前后台之间传递的编码都是UTF-8那倒还好处理,万一不都是UTF-8呢?

下面提供通用的办法,可以解决中文,日文,韩文等语言乱码问题

//从数据库查出所有对象
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">

编码!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: