您的位置:首页 > 其它

new String(str.getBytes("8859-1"),"gb2312")

2013-06-30 00:00 405 查看
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字符数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐