博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
new String(str.getBytes("8859-1"),"gb2312")
阅读量:5928 次
发布时间:2019-06-19

本文共 1084 字,大约阅读时间需要 3 分钟。

hot3.png

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字符数组。

转载于:https://my.oschina.net/u/152698/blog/141430

你可能感兴趣的文章
IntelliJ IDEA 13怎么创建JAVA SE项目
查看>>
linux 模拟延时和丢包
查看>>
Smart3D系列教程7之 《手动配置S3C索引加载全部的瓦片数据》
查看>>
Java - 配置Java环境
查看>>
Linux - 终端语言设置
查看>>
算法导论——最小生成树
查看>>
解析函數論 Page 29 命題(1) 有界閉集上的一致連續性
查看>>
监听文件输入的例子
查看>>
进程VS线程
查看>>
循环语句
查看>>
【Spring】浅谈spring为什么推荐使用构造器注入
查看>>
如何判断raid1中哪块硬盘损坏?
查看>>
c++ 求数组元素的全排列
查看>>
第七周LINUX学习笔记
查看>>
Kali渗透测试——UPNP网关发现工具Miranda
查看>>
LINGO的数据段
查看>>
sql小总结
查看>>
python基础之socket编程
查看>>
PHP 协程:Go + Chan + Defer
查看>>
IOS学习:隐藏键盘方法
查看>>