zoukankan      html  css  js  c++  java
  • 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编码的中文字符是三字节的。

    温润如玉,坚毅如铁。
  • 相关阅读:
    Spring
    linux下jdk多版本管理
    linux集群管理
    python多任务处理
    Web框架的引入
    Git命令大全
    Git远程仓库--GitHub
    基于python实现简单web服务器
    python文件读写方式
    几句话搞懂URI、URL、URN之间的关系
  • 原文地址:https://www.cnblogs.com/heisen/p/9968001.html
Copyright © 2011-2022 走看看