String源码分析之getByte乱码

来源:互联网 发布:中国网络电视台纪实台 编辑:程序博客网 时间:2024/05/21 06:40

当我们想把字符串转化为某种类型的编码格式时,容易出现乱码;比如下面的代码,很容易造成误区,getByte里面的gbk编码到底是编码还是解码;调用这个方法前,字符串之前编码了没;怎么还原字符串等等

1.示例演示

        String testStr="I love 中国";        byte[] bytes = testStr.getBytes("gbk");        String decode1=new String(bytes,"GBK");        System.out.println("decode1:"+decode1);    System.out.println(Charset.defaultCharset().name());

2.分析

2.1 byte[] bytes = testStr.getBytes(“gbk”);
* 字符串对象调用getBytes方法的时候,并没有编码;
* getBytes传递的编码名称,是编码过程;
* 编码过程是指将字符串转化为字节数组
* 解码过程是指将字节数组转化为字符串
* testStr这个引用是在栈中,字符串是在常量池里面,也就是方法区,内存中字符编码默认为UTF-16
* 该方法执行之后,字符串就转化为gbk编码格式的字节流
2.2 String decode1=new String(bytes,”GBK”);
* 该过程是解码过程
* 将bytes字节流转化为字符串
* 解码使用的编码方法为GBK
* 如果此处使用UTF-8解码,就可能出现乱码
* 为什么是可能出现乱码呢,是因为如果只是ASCII码,两者是兼容的
2.3 本系统编码格式
* Charset.defaultCharset().name()用来表示本系统的编码格式

3.乱码分析

3.1 当字符超过了我们正使用的编码范围时,就会出现乱码
* 使用单字节编码对中文或非ASCII码进行编码,这样会造成信息丢失,即使使用相同的编码格式解码,也无法还原信息
* 常见的有ISO-8859-1,如果用它对中文进行编码,那么解码后就会出现?
* 编码方法与解码方式不同,且不兼容,比如使用gbk编码,然后使用utf-8解码

0 0