Java-IO的编码解码问题
2015-01-09 13:48
197 查看
/article/4150929.html
Java字符转码问题:/article/1737204.html
总结: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格式的。
Java字符转码问题:/article/1737204.html
总结: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格式的。
相关文章推荐
- java io的编码问题
- java中字符串的编码解码问题
- java编码解码乱码问题
- java.net.URLEncode编码 与 URLDecode解码问题
- java IO之 编码 (码表 编码 解码 转换流)
- java.net.URLEncode编码 与 URLDecode解码问题
- java.net.URLEncode编码 与 URLDecode解码问题 -
- IO_缓冲流_转换流_字节转为字符_乱码分析_编码与解码JAVA152-154
- java.net.URLEncode编码 与 URLDecode解码问题
- IO学习(十)了解解码与编码,用转换流处理乱码问题
- java.net.URLEncode编码 与 URLDecode解码问题
- java中字符串的编码解码问题
- 黑马程序员——java之IO体系中File类、编码问题、对象序列化
- java中的编码与解码问题
- 编码问题之:java.io.UTFDataFormatException: Invalid byte 2 of 2-byte UTF-8 sequence.
- java io输出的编码问题
- 编码问题之:java.io.UTFDataFormatException: Invalid byte 2 of 2-byte UTF-8 sequence.
- java解码与编码若干问题
- 回答张孝祥老师的问题:Java里UTF-8的编码和解码
- java.net.URLEncode编码 与 URLDecode解码问题