在学习JAVA EE阶段老是遇到各种各样的乱码问题, 碰到得多了也就有了一点经验, 今天在使用jspsmartupLoad这个组件时又遇到了乱码的问题, 面对这么多的乱码我想我是时候来总结一下了。
在提交时出现乱码的原因在于: 提交时的字符编码没有被指定, 从理论上来说没有指定字符编码Web服务器总是会使用默认的的字符编码来获取提交的参数。 而一般默认的字符编码为ISO-8859-1。ISO-8859-1属于单字节编码,无法表示中文。因此在提交页面的过程中遇到乱码也就不足为奇了。 常用的支持中文的编码有如下几种:
1、 GB2312/GBK: 汉字的国标码,专门用来表示汉字,是双字节编码,而英文字母和ISO-8859-1一致(兼容ISO-8859-1编码)。其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK兼容GB2312.
2、 Unicode/UTF: unicode是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。UTF编码兼容ISO-8859-1,同时也可以用来表示所有语言的字符,不过UTF编码不是定长编码,每一个字符从1到6个字节不等, 通常使用UTF编码来实现国际化的支持。
————解决问题的思路
把基础知识积累完全,就可以来解决问题了,解决问题有两个思路:
(1)、 既然默认是以ISO-8859-1编码提交,那么只需要在获取使用时, 以页面展示的字符编码和ISO-8859-1之间进行转换即可。
(2)、 既然默认是以ISO-8859-1编码提交,那么只要将提交的编码方式改成页面展示的字符即可。
对于第一种思路, 这个做法原理十分简单,利用String类恶构造:
public String (byte bytes[], String charsetName). 通过byte类型的参数和String类型的编码方式参数,将byte类型的参数转换为String类型的编码方式参数所制定的编码。 如: new String(xxx.getBytes("ISO-8859-1"), "utf-8");
^_^ ^_^ 此种方式虽然可行,但是很“笨”, 页面的递交参数一旦多了, 对每个参数进行转换是十分无趣与痛苦的工作。
当然人是灵活的, 可以对上述这个繁琐的过程进行抽象: 请看如下的charsetConvert.java
public class charserConvert{
//把两种编码类型生命为两个静态变量
final static public String gbCharCode = "gb2312";
final static public String IsoCharCode = "iso-8859-1";
public charsetConvert(){}
public static String convertCharCode(String str, String charCodeOld, charCodeNew ){
String result = str;
if(result!=null && !result.trim().equals("") ){
if( ( !charCodeOld.trim().equals("") && !charCodeNew.trim().equals("") )){
byte bytes[] = result.getBytes(charCodeOld);
result = new String(bytes, charCodeNew);
return result;
}
}
}
// ”GB2312“与”ISO-8859-1“转换函数
public static String convert(String message){
return convertCharCode(message, )
}
//中文转换函数
public static String parseChinese(String in){
String s = null;
byte[] temp;
if(in == null){
return "";
}
temp = in.getBytes(NewCharCode);
return s;
}
}
————第二个方案
使用过滤器, 在过滤器中使用request.setChacterEncoding("*****");
SetCharacterEncodingFliter 过滤器会从web.xml中获取encoding参数来装饰request, 注意,web.xml中的encoding参数必须与页面设置的编码方式一致, 否则即使使用了过滤器,一番会得到乱码的结果。
————————知识补充————————
在JAVA编程语言的应用中, 对中文字符的支持并非像JAVA标准所宣称的那样完美, 因为中文字符集不知一个, 而且不同的操作系统对中文字符的支持也不尽相同, 所以会有许多和汉字编码处理有段的问题会在进行开发应用中困扰开发者。 英文字符一般式以一个节来表示的, 最常用的编码方法是ASCII。 单一个字节最多只能区分256个字符, 而汉字成千上万,所以现在汉字都以双字节来表示汉字, 为了能够与英文字符分开, 每个字节的最高位一定为1, 这样子双字节最多可以表示64K个字符。 经常碰到的编码方式有GB2312, BIG5, UNCODE,GBK等。 UNICODE码事微软提出的解决多国字符问题的多字节非等长编码....
基于JAVA的编程语言进行应用开发时, 不可避免地要处理中文, JAVA编程语言默认的编码方式是UNICODE, 而通常使用的数据库及文件都是基于GB2312编码的, 所以.........
——————————————^_^ ^_^ ————————————————
还得注意一些特殊的编码问题, 如ajax与jspsmartupLoad中的编码问题就比较特殊, 用上述的通用方式有时解决不了!!!