1,在java的IO编程中常常会遇到字符串和字节数组转换乱码问题

2,出现乱码的原因可能是编码不统一。

3,乱码原因还有可能是字符集长度不统一。

首先来看编码,编码就是字符串转换为字节数组。

java inputstream乱码 javastring乱码_字符串

 编码中用到String类的getBytes方法,这个方法能够将字符串转换位字节数组。

java inputstream乱码 javastring乱码_字符串_02

 上面这一段呢是String类中的getBytes方法,可以看到它返回StringCoding.encode(...........),我猜呢,StringCoding类就是将String字符串编码成字节,当然里面有很多我看不懂的方法(新手猜测,才学会看一点点源码,说错了请大佬指教),转换了之后呢,下面是控制台输出的字节数组的长度

java inputstream乱码 javastring乱码_java inputstream乱码_03

我工程中用的是GBK编码,所以呢,说明在GBK编码中一个汉字占有两个字节。

接下来呢,我将字符编码改为UTF-8

java inputstream乱码 javastring乱码_java inputstream乱码_04

同样呢,getBytes(charset)这个方法就没什么好讲了,它无非就是上一个方法的前提上加个编码方式

来看结果

java inputstream乱码 javastring乱码_编码方式_05

 结果呢可以发现在UTF-8编码方式中,一个汉字占三个字节。

接下来那我们来看解码过程。

解码过程就是将字节数组转换成字符串的过程

java inputstream乱码 javastring乱码_java inputstream乱码_06

 解码过程很简单,就是使用String类的构造器,当然类中的构造器肯定不止一个,开篇我们说到发生乱码的原因是编码方式不统一和字符集长度不统一,下面就来测试一下

java inputstream乱码 javastring乱码_java inputstream乱码_07

 将原本的GBK转换成UTF-16LE结果就如下了

java inputstream乱码 javastring乱码_编码方式_08

 接下来就是字节长度引起的乱码问题

java inputstream乱码 javastring乱码_编码方式_09

我们从0-length-3GBK编码方式进行解码,上面说了一个汉字用GBK编码占两个字节,也就是说我们从0-length-3就是取到三个字节,然后呢,三个汉字总共6个字节所以,我们只能取到一个半汉字,所以乱码就产生了。来看看结果。

java inputstream乱码 javastring乱码_编码方式_10

完结。