下面介绍一下乱码的根本原因:

大家都知道,字符集有很多种,ASCII,Unicode,utf-8,GBK,GB2312,ISO889-1等等等等,这些字符有什么区别相信各位都能在网上查到详细的说明,这里只说一点,GB2312是Windows中文版默认的字符集(未进行确认),而且GBK是兼容GB2312的。

乱码本质:

1. 只有在字符串转化为字节数组(或者字节数组变为字符串)时才需要用到字符集

2. 在内存中(一般是字符串变量或字符串对象状态)是什么内容就是什么内容(包括中文,和编码无关)

3. 乱码的根本原因是字符串转化为字节数组和字节数组转化为字符串时使用的字符集不同。

下面给大家详细叙述:

1.存储在硬盘上的字符:

GBK Java 英文字符 java中中文字符串转为gbk_GBK Java 英文字符

如上图所示,当“中国”两个汉字存储到硬盘时,会以字节的形式存储(也就是二进制形式存储),“中”字在“utf-8”字符集中对应的二进制是“0xE4B8AD”,“国”字在“utf-8”字符集中对应的二进制是“0xB9FA”,如果按照“GBK”字符集对应,“0xE4B8AD”对应的字符是”涓”,而“0xB9FA”在“GBK”中对应的字符是:“浗”,所以,按照“utf-8”字符集编码写入硬盘的字符“中国”按照“GBK”字符集解码出来的字符串就是“涓浗”,这就是硬盘乱码的原因。

2.在网络上传输的字符:

其实在网络上传输字符和以硬盘类似,一个是以网络为媒介,一个是以网络为媒介。

GBK Java 英文字符 java中中文字符串转为gbk_乱码_02

如上图所示,当发送方将“中国”两个汉字发送到网络上时,字符串会以字节的形式存储(也就是二进制形式存储),“中”字在“utf-8”字符集中对应的二进制是“0xE4B8AD”,“国”字在“utf-8”字符集中对应的二进制是“0xB9FA”,如果按照“GBK”字符集对应,“0xE4B8AD”对应的字符是”涓”,所以发送方传输到网络的值为“0xE4B8AD0xB9FA”,而“0xB9FA”在“GBK”中对应的字符是:“浗”,所以,按照“utf-8”字符集编码发送到网络上的字符“中国”接收方按照“GBK”字符集接收到的字符串就是“涓浗”,这就是在网络传输时乱码的原因。

3.重复一下乱码解决的根本方法:

1. 只有在字符串转化为字节数组(或者字节数组变为字符串)时才需要用到字符集(字节数组和硬盘上存储的或网络上传输的信息相对应,可以理解为 是相同的)

2. 在内存中(一般是字符串变量或字符串对象状态)是什么内容就是什么内容(包括中文,和编码、字符集无关,在这里不用引起乱码,只有当按照某个字符集进行转化时,才可能导致乱码)

3. 乱码的根本原因是字符串转化为字节数组和字节数组转化为字符串时使用的字符集不同,如果双方参照的字符集相同,就不会出现乱码,也正是解决乱码的根本所在(硬盘:在存储时和在读取时使用相同的字符集,网络:在发送时和接收时使用相同的字符集)。