最近在工作中遇到了中文字符乱码问题。整了老长时间才把乱码消除,但对于编码问题还是一知半解的。今天上网查了一些资料。做个小结。希望在以后的编程过程中能顺利解决这类问题。也抛砖引玉,希望同行多多指教。
一般的转码问题,要么在配置中设置,要么就自己写程序转码。我感觉在编码转换的过程中,主要用到了以下几个函数。
1.getBytes(charset),作用:将字符串按照charset编码方式,并以字节方式表示
public static void test1() throws Exception{
String te="中文";
System.out.println(te.getBytes("gb2312"));//4字节
System.out.println(te.getBytes("unicode"));//6字节
System.out.println(te.getBytes("iso8859-1"));//2字节
System.out.println(te.getBytes("utf-8"));//6字节
}
2.new String(bytes,charset) 作用:以charset编码将字节数组重新组合,最后转换为unicode编码存储。与getbyte()作用正好相反。
public static void test2() throws Exception{
String te="中文";
//utf-8不定长编码,中文用三个字节表示。英文字符用一个字节表示,常用于网络传输。
String tar=new String( te.getBytes( "utf8" ), "utf8" ) ;
System.out.println(tar);//"中文"
//iso8859-1表示的字符很窄,无法表示中文。所以没法对其进行编码。
tar=new String( te.getBytes( "iso8859-1" ), "iso8859-1" ) ;//
System.out.println(tar);//"??"
//双字节编码,英文字符与iso8859-1一致,gbk编码能够表示中文繁体和简体,而gb2312只能表示中文简体。所以gbk表示的范围更广,且兼容gb2312
tar=new String( te.getBytes( "gbk" ), "gbk" ) ;
System.out.println(tar);//"中文"
//java默认编码,定长双字节,也有四字节,包括中文字符。便于计算机计算。
tar=new String( te.getBytes( "unicode" ), "unicode" ) ;
System.out.println(tar);//"中文"
}
3.setCharacterEncoding() 函数用来设置http请求或者相应的编码, 对于request,是指提交内容的编码。指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码。但该方法只对post方法有效,对get方法无效。其实也可以通过另一种方法来设置。在tomcat中通过配置文件server.xml来设置,例如::。这种方法对所有的jsp文件都有效,但是没法针对具体的jsp文件进行设置。 对于response,则是指定输出内容的编码方式。与页面中的contenttype效果一样。该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。
4.URLEncode.encode()/URLDecode.decode() java本身提供的url编码函数,在编码的时候最好指定值。如果不指定编码方式,系统会按照操作系统默认的方式来编码。因为系统平台的差异,会导致编码结果的不确定。比如对于"中文",当系统默认编码为"gb2312"时,结果是"%4e%2d%65%87",而默认编码为"UTF-8",结果却是"%e4%b8%ad%e6%96%87",后续程序将难以处理。linux下系统默认编码是由运行tomcat时的环境变量LC_ALL和LANG等决定的,建议统一采用utf-8方式来处理
第一次写工作小结,感觉没多少思路,不知从何入手。大多是参考一下资料的。以后写的时候还得好好总结,多实践几次,再通过自己的语言表达出来,
参考文献:
字符集编码--问题研究
http://china.manufacturer.com/article/study_for_character_encoding_java.htm
JSP中的pageEncoding和contentType属性