new String(str.getBytes("8859-1"),"gb2312")
大家一看就知道,这就是我们用来对付jsp里中文乱码用的东西。
但是今天研究jdk中对String类的相关说明的时候,却发现读不懂这条语句。
大家都知道,Java中的String类中的数据都是用Unicode编码的字符数组来保存的(保存的数据的编码并不见得是正确的Unicode编码,就像我们的Jsp页面里的中文,都是错的)。另一方面,
按照jdk的说明,str.getBytes("8859-1")的作用是将字符串str中的字符数组以ISO8859_1的格式编码为字节数组。
而new String(bytes, "gb2312")的作用是将字节数组bytes以GB2312的格式解码为字符数组。
当把三者联系起来以后,我们得到的关于new String(str.getBytes("8859-1"),"gb2312")语句的功能自然就是:
将字符串str中以Unicode字符数组(此时的字符数组并不是正确编码了中文字符的Unicode字符数组)保存的数据,以ISO8859_1的格式编码为字节数组,再将该字节数组以GB2312的格式解码为字符数组并保存到Unicode字符数组中(此时的字符数组是正确编码了中文字符的Unicode字符数组)。
如果是这样的话,相当于什么呢?相当于我们把一个文件用zip格式进行压缩,然后用rar格式来解压缩。其结果可想而知。
但是目前的实际情况是,new String(str.getBytes("8859-1"),"gb2312")工作得非常正常。
而理论上应当正常工作的下面这条语句,实际上无法正常运行:
new String((new String(str.getBytes("8859-1"), "8859-1")).getBytes("GB2312"))
(此语句的功能应当是:将字符串str中以Unicode字符数组(此时的字符数组并不是正确编码了中文字符的Unicode字符数组)保存的数据,以ISO8859_1的格式编码为字节数组,再将该字节数组以ISO8859_1格式解码为字符数组并保存到Unicode字符数组中(此时的字符数组是正确编码了中文字符的Unicode字符数组)。然后将这个正确编码了中文字符的Unicode字符数组中的数据以GB2312格式编码为字节数组并转换为一个GB2312格式编码的Unicode字符数组。