您的位置:首页 > 其它

String源码分析之getByte乱码

2016-11-12 16:31 309 查看
当我们想把字符串转化为某种类型的编码格式时,容易出现乱码;比如下面的代码,很容易造成误区,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解码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  string 源码 编码