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编码的中文字符是三字节的。

    温润如玉,坚毅如铁。
  • 相关阅读:
    Azure 虚拟机安全加固整理
    AzureARM 使用 powershell 扩容系统磁盘大小
    Azure Linux 云主机使用Root超级用户登录
    Open edX 配置 O365 SMTP
    powershell 根据错误GUID查寻错误详情
    azure 创建redhat镜像帮助
    Azure Powershell blob中指定的vhd创建虚拟机
    Azure Powershell 获取可用镜像 PublisherName,Offer,Skus,Version
    Power BI 连接到 Azure 账单,自动生成报表,可刷新
    Azure powershell 获取 vmSize 可用列表的命令
  • 原文地址:https://www.cnblogs.com/heisen/p/9968001.html
Copyright © 2011-2022 走看看