java下输出中文的一点研究

网上或者大部分书上都说Java中输出中文使用FileReader类就可以了,但是当你读取一个中文文档时,你会发现,除了乱码,还是乱码。究其原因,这其实是文件流读取时使用的编码方式和文件本身编码方式不同,造成读取出来文件乱码。还有一个细节,当你使用read()直接读取字符输出时,无论如何都是读不出中文的。关于这类问题,给出两种解决方案:

一、使用BufferedReader类包装一下FileReader类,然后使用BufferedReader::readLine()方法读取一行的String,然后用这个String再去构造一个新的String输出,具体如下:

FileReader f = new FileReader("test.txt");
BufferedReader is = new BufferedReader(f);
String str = null;
while((str = is.readLine()) != null){
System.out.println(new String(str.getBytes("GBK","utf-8"));
}

这样就能输出大概正确的中文了。为什么说是大概呢?因为它可能还会有“???”或者其他一些糟心的符号。因此这种方法并不完美。另一种方法如下:

二、使用FileInputStream类读取文件,然后使用InputStreamReader类来封装,最后再使用BufferdReader来读取一行:

FileInputStream f = new FileInputStream("test.txt");
InputStreamReader is = new InputStreamReader(f,"utf-8");
BufferedReader ret = nrew BufferedReader(is);

String str = null;

while((str = ret.readLine()) != null){
System.out.println(str);
}

使用这种方法就能完美显示中文,而没有乱码。但是要求中文文本使用utf-8编码。

另外,还有一种编码是utf-8-BOM编码,这种编码和utf-8不一样,他在文件开头有三个字节的标识符,如下图第一行:

ef bb bf 就是文件标识符,上图中第一行是utf-8-BOM的“我是陈宇翔”的十六进制编码,第二行是utf-8的“我是陈宇翔”的十六进制编码。我们发现,第一行的后十五个字节和第二行完全一样。所以当你使用utf-8-BOM的文档,而使用utf-8方式去读取时,输出的第一个字符会是乱码。同时我们还发现,utf-8编码的中文字符是三字节的。

温润如玉,坚毅如铁。
原文地址:https://www.cnblogs.com/heisen/p/9968001.html