`
mj914
  • 浏览: 33824 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java utf-8转码解码问题

阅读更多

总结:servlet 当路径中有%%的时候 会自动进行url解码。具体请看我的工作日志

utf8, gbk, iso8859-1编码

1. sData.getBytes();和sData.getBytes("gbk")作用是一样(如果你是中文系统的话) 因为中文系统内码(即默认编码)一般是GBK。而getBytes()的意思是把串生成某个编码的字节流,并转换成byte数组。
2.sData = new String(sData.getBytes("iso8859-1"), "gbk");
这句的意思是告诉 java,请把它生成ISO-8859-1编码的字节流数组,在new String的时候传入GBK这个参数,告诉编译器这个byte数组其实是以gbk编码的,这样new String的时候编译器就可以正确的把它转换成Unicode了,因为java中string是unicode编码的
3.sData = new String(sData.getBytes("gbk"), "UTF8");
为什么这样写不对呢?先说new String(sData.getBytes("iso8859-1"), "gbk");。先看你把文件内容读到String中的时候,你需要告诉Java把你文件内容看作是ISO-8859-1编码的(其实是GBK或Unicode或其他),而因为ISO-8859-1是一个字节的,所以读文件内容并转换为sData的时候,java只是把每个字节前加 0x00组成unicode,所以后来当用这句sData.getBytes("iso8859-1")都可以解析出原来的字节,就是说信息不会丢失,因为只是把0x00去掉而已。(这个过程就好象加密解密)但是注意这串字节流实际上不是ISO-8859-1的(但java并不知道)。
而GBK是1-2字节的,如果你文件是UTF-8(1-6字节),那么你告诉java这个文件内容是GBK的,java就以GBK编码去读入这串字节流,但是这里会发生信息丢失或错乱,因为这个字节流并不是GBK的,而是UTF-8的,然后再用new String(sData.getBytes("gbk"), "UTF8");显然就恢复不了了。
你可以做个试验保存个GBK的文件,用UTF-8去读,然后new String(sData.getBytes("UTF-8"), "GBK");也肯定是不行的。所以只有ISO-8859-1才可以这么做

 

GBK和Unicode都兼容ISO-8859-1,但这并不是 new String(sData.getBytes("iso8859-1"), "gbk");可以运行的原因。因为在从文件读入的时候,其实就已经按ISO-8859-1编码读入那些中文了,ISO-8859-1并不兼容GBK,所以按兼容来解释的话,那么这里就应该已经出错了。但是事实上并没有出错,但是因为ISO-8859-1是单个字节的,它把每个字节认作一个字符读入,这样不会丢失信息。
也就是说比如:你的文件内容是“hello你好"那么java以ISO-8859-1读入的时候,会认为这里有9个字符,然后转换为Unicode(String是unicode的),还是9个字符但是就变成18个字节了。
然后用sData.getBytes("ISO-8859-1"),还是可以恢复成原来的摸样,仍然是9个字节。
这样字节信息没有丢失,于是就可以顺利的以GBK解析并把它转换成java中的String。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics