由于程序编程过程中存在众多的编码集,而这些编码集又各自有自己的方法来表示一个中文字符。由此,造成我们的程序显示中文的时候乱码。最多的是本来是中文,但结果显示为问号?
这篇文章从我碰到过的问题来从根本上解决乱码的问题,反正我用这个方法是百战百胜^_^嘎嘎
我们知道,在我们的中文系统中使用的是“GBK”编码集。
也就是说,比如我们从本地系统中读入一个包含中文内容的.txt文件,那么我们从这个磁盘空间所获得是流文件是个经过“GBK”的。
但是,假如我们的JVM默认的编码集是“ISO-8859-1”,那么这个流文件经过我们的JVM编码就变成一个Unicode的字符或者字符串。
是不是说的很抽象。
下面我具体解释一下。
什么是编码?编码说白了就是从字节到字符(Unicode)的过程,因为我们的字符或字符串在JVM中是用Unicode表示的,也就是说编码实质上是获取一个Unicode码的过程。
我再来解释一下解码?解码就是把JVM里的Unicode码转换成我们本地字符集所表示的字节流。
如果在编程过程中,JVM默认的字符集和我们的中文系统,或者数据库文件等采用的字符集不一样。
这样的情况下,如果我们仅仅是编码,而不去解码。也就说把本来用“GBK”的字节流采用“ISO-8859-1”转换成字符或字符串,这个时候就产生了乱码。
当然,现在JVM和中文系统默认的编码集已经一样了,所以产生这种情况的很少。但是在读取数据库文件的时候依然会经常碰到这种情况。所以,我一贯主张从本质上来了解一个知识,然后才能融会贯通,应用自如,这是高手的境界,当然,我不能算高手^_^哈哈
好了,如果你现在还不明白编码解码怎么回事?以及乱码产生的原因。我想你可以去撞墙了。
那么,编码的时候两个系统的字符集不一致,该怎么办呢?怎么样把他们变成一致?
如果有可以直接改变系统字符集的方法,那当然是最好的了。比如在JVM里
Properties pps = System.getProperties();
pps.put("file.encoding","GBK");
这样,就把JVM的默认字符集改变成“GBK”了。
那么,如果没有改怎么办?
什么?没办法?那是不可能滴,没有程序解决不了的问题,这也是偶滴名言,嘎嘎!
当然要再次编码了,或者说重新编码!
还记得不?刚才我们解码的时候得到一个利用JVM解码的字符或字符串(也可以说Unicode)
好,如果不记得,麻烦你再看看上面写的,记性太差了!
我们利用这个字符或字符串再重新编码。
我们把这个字符或字符串再次现出原形,也就是字节数组。
byte[] data = str.getBytes("ISO-8859-1");
好,现在又获得了“ISO-8859-1”字符集下的字节数组。
这个里面就完整的存放着我们想要的汉字,哈哈。
得到了字节数组,不就好办了吗?
还不会?没关系,我教你!
String newstr = new String(data,“GBK”);
好了,得到了我们完整的字符串了!编码变成!
这个字符串就是我们要的中文系统下的字符串,它又经过我们“GBK”编码过了!
可以放心的输出到中文系统下了。
其实说白了,编码解码就是把我们从系统得到的字符转换成字节数组,然后对它用系统字符集加工,加工完后再重新包装,再把它输出。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=664992