彻底解决程序乱码问题

来源:互联网 发布:呼啦圈能减肚子吗 知乎 编辑:程序博客网 时间:2024/05/16 10:13

        由于程序编程过程中存在众多的编码集,而这些编码集又各自有自己的方法来表示一个中文字符。由此,造成我们的程序显示中文的时候乱码。最多的是本来是中文,但结果显示为问号?

       这篇文章从我碰到过的问题来从根本上解决乱码的问题,反正我用这个方法是百战百胜^_^嘎嘎

       我们知道,在我们的中文系统中使用的是“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


原创粉丝点击