我会从三个方面:字符编码的字节数、乱码原因、解决方法来说明我所遇到的乱码问题。
今天工作的时候碰到一个问题,在新建 TXT 文档的时候,使用的是Windows 自带的笔记本工具,所以新建的文本文档的字符编码是采用的系统默认编码,即 GB2132 。当时我也没有在意,由于对文档内容修改要用到正则表达式,所以顺手用Eclipse 打开,发现全是乱码,因为Eclipse 的环境被我设为 UTF-8 ,因此打开的时候文档是乱码。我将Eclipse 的环境设为GB2132 后,影响了我原来的Java 文件。到这里也都没什么,但问题在于我再次将Eclipse 的环境设回UTF-8 时,原来的文档仍然是乱码。
我尝试了多种方法未能解决这个问题,直到我搜索了有关资料才发现一个答案:
如果原始编码的byte数组未保留,那么不是所有字符编码都可逆的。
换句话说:
不保留byte 数组,字符的编码格式转换不是完全可逆的,会导致无法解决的乱码。
字符编码的字节数
我们实际上没有必要去深究每一种编码具体把某一个字符编码成了哪几个字节,我们只需要知道“编码”的概念就是把“字符”转化成“字节”就可以了[1]。但关键在于对应不同的编码的“字符”转化,最后“字节”的长度是不同的。
常用编码格式[2]:
编码格式 | 中文字符所占字节数 | 英文字符所占字节数 |
UTF-8 | 3 | 1 |
UNICODE | 4 | 4 |
GBK | 2 | 1 |
GB2312 | 2 | 1 |
ISO8859-1 | 1 | 1 |
ASCII | 1 | 1 |
这些内容倒无记忆的必要,但可以看出不同的编码格式其所占字节数确有不同。
乱码原因
UTF-8 用3个字节编码一个汉字,Default (在中文系统上是GB2312 )用2字节编码一个汉字。3个汉字由UTF-8 编码后变为9字节,而Default 解码时每2字节解码为一个汉字,最后一个字节无法解码,则回退为'?'。
反过来也是一样的状况,由于字节数不足,发生编码回退,最后导致编码错误[3]。
解决方法
如果你能获取到原始编码的byte 数组,确实可以用UTF8解码出正确的字符.
但是如果你得到的已经是一组乱码,则不可能反解出正确的字符.
因为所有无法编译的数据都已经显示为问号和方块,你无法知道它原来到底是个什么东西.
[1] http://www.regexlab.com/zh/encoding.htm 字符,字节和编码
[2] http://www.cnblogs.com/Qian123/p/5799835.htmlJava不同编码方式,中英文字符所占字节数
[3] http://bbs.csdn.net/topics/390808721 字符串编码转换问题?encoding.utf8,default