Java-IO的编码解码问题

http://a-bun.iteye.com/blog/1852912

Java字符转码问题:http://blog.csdn.net/zhengqiqiqinqin/article/details/12621201

总结:1.要清楚文件的编码格式。2.采用相同的编码进行读取/写入

Java程序使用的的编码:取决于操作系统的编码,中文的操作系统是采用用GBK编码

记事本程序默认的编码:

                              系统的记事本程序默认采用ANSI(美国国家标准学会)编码,如果你新建一个demo.txt文件,

                               在里面写入“联通”保存,再打开文件,发现“联通”变成了其他字符。因为,系统采用GBK编码

                               写入,而记事本采用ANSI编码保存,所以出现乱码。(由这个问题,可以发散出很多问题。

                               比较常见的一个问题就是:我已经把文件保存成了 XX 编码,为什么每次打开,还是原来的 YY

                              编码?!原因就在于此,你虽然保存成了 XX 编码,但是系统识别的时候,却误识别为了 YY

                              编码,所以还是显示为 YY 编码。为了避免这个问题,微软公司弄出了一个叫 BOM 头的东西。)

unicode和utf-8:

                         UNICODE 来到时,一起到来的还有计算机网络的兴起,UNICODE 如何在网络上传输也是一个必须考虑

                         的问题,于是面向传输的众多 UTF(UCS Transfer Format)标准出现了,顾名思义,UTF8 就是每次8

                         个位传输数据,而 UTF16 就是每次16个位,只不过为了传输时的可靠性,从UNICODE到 UTF时并不是

                         直接的对应,而是要过一些算法和规则来转换。

对于新创建一个文件,并写入内容时,它的文件保存编码是什么?

                          这取决你写入内容的方法采用的编码格式(默认是GBK),我们知道如果采用字节输出流把字节输出到某个文件,

                          我们是无法指定生成文件的编码的(假设文件以前不存在),那么生成的文件是什么编码的呢?经过测试发现,

                         其实这取决于写入的字节编码格式。比如以下代码:OutputStream out = new FileOutputStream

                         ("d:\\demo.txt"); out.write("我们".getBytes());getBytes()会采用操作系统默认的字符集来编码字节,

                         这里就是GBK,所以我们写入demo.txt文件的是GBK编码的字节。那么这个文件的编码就是GBK。如果稍微修改

                         一下程序:out.write("我们".getBytes(“UTF-8”));此时我们写入的字节就是UTF-8的,那么demo.txt文件编码

                         就是UTF-8。这里还有一点,如果把”我们”换成123或abc之类的ascii码字符,那么无论是采用getBytes()或者

                         getBytes(“UTF-8”)那么生成的文件都将是GBK编码的。这里可以总结一下:

                         InputStream中的字节编码取决文件本身的编码,而OutputStream生成文件的编码取决于字节的编码。

在java中读取写入文件时应该采用什么编码:

                                 读取文件时要知道文件是采用什么编码,只要我们读取时采用的编码和文件保存时编码

                                 一样,就不会出现乱码的问题,我们Java程序默认采用系统的编码(GBK),所以在字节

                                 字节流读取时,InputStream.read()方法来读取字节,然后保存到一个byte[]数组中,

                                 最后经常用new String(byte[]);这里byte数组变成String的过程,是用GBK来变的,如果

                                 你想使用其他编码变成String可以用它的构造方法new String(byte[],”UTF-8”);

                                 字节流写入时,OutputStream out = new FileOutputStream("d:\\demo.txt");

                                 out.write("我们".getBytes()); 这里的“我们”变成byte数组是采用GBK编码,

                                  如果你想用其他的编码,可以使用String的方法,"我们".getBytes(“UTF-8”)。

                                  字符流读取/写入文件:字符流可以看作是一个包装流,其低层的操作还是字节流实现的

                                  InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”));默认是GBK

                                 InputStreamReader  in = new InputStreamReader(new FileInputStream(“demo.txt”),”UTF-8”);

                                 指定为UTF-8编码。同理:OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream

                                 (“dd.txt”),”UTF-8”);写入的字符将被编码为UTF-8的字节,所以生成的文件也将是UTF-8格式的。

 

posted @ 2015-01-09 13:48  beyondbycyx  阅读(180)  评论(0编辑  收藏  举报