JSP/JavaBean等接收参数出现乱码的解决方法
作者:ade 日期:2010-10-25
今天上课,有一个同学编写的JavaBean,在接收中文参数的时候,出现了乱码现象。在Java编程过程中,经常会出现这种情况。
首先明确一下什么是编码与解码的概念。在Java的字符串操作的概念里,如String类,按照一定的字符集将字符转换成一个字节数组称为编码,反过来,将一个字节数组转换成字符串称为解码。
为什么这么做?是因为传输的时候都是使用字节传送的,计算机是不认识什么字符的,字符是某个数字(或者符号)在某个字符集里映射后才能显示出来或者做其他的处理。
现在给出三种解决办法:
第1种解决方法
话说回来,解决这种问题比较常用的做法是使用request.setCharacterEncoding()方法,将之设置成与提交数据的页面提交的数据一样的编码,怎么确定呢,在提交数据的jsp页面,找到<meta http-equiv="Content-Type" content="text/html; charset=GBK">,看到charset为GBK就设置成GBK就可以了。
第2种解决方法
第二种方法是不使用request.setCharacterEncoding(),而是写一个编码转换函数,将接收过来的乱码转换成需要的代码。Tomcat在对post数据传输的时候,认为你使用的是ISO-8859-1编码,事实上本来数据可能是gbk编码,现在接收过来使用ISO-8859-1进行解码当然会出问题,解决方法是,既然自动的是按照ISO-8859-1解码,我们再把这个过程还原回去,就是先用ISO-8859-1编码,得到原来的用GBK编码的字节数组(注意这里),然后再显式调用GBK字符集进行解码。本文原创,转载请注明来自historycreator.com
具体如下:
/*得到字符串historycreator的原来使用gbk编码的字节数组(为什么这样能得到?自己考虑下)*/
byte[] hc = historycreator.getBytes("iso-8859-1");
/*重新使用gbk进行解码,得到正确的字符串信息*/
historycreator = new String(hc,"gbk");
如果在一个JavaBean里,就可以直接在setter方法里进行转换。
如:
public void setUsername(String username) {
try {
byte[] b = username.getBytes("iso-8859-1");
username = new String(b,"gbk");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
this.username = username;
}
这样就可以正确显示了。
第3种解决方法
本质上仍然使用第2种的原理,使用过滤器(filter),在过滤器里对传过来的参数进行修正即可,具体方法网上有,请在本站首页搜索一下 "过滤器 乱码 " 或者 "java 乱码".
本文原创,转载请注明来自historycreator.com