`
arpenker
  • 浏览: 365649 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java读取txt文件乱码惹人烦

阅读更多
java读取txt文件乱码解决方案
2017年09月19日 14:42:52 sysmedia 阅读数 3682
因为txt默认的选项是ANSI,即GBK编码。GBK和GB2312都是中文编码,在这里解释一下两者的区别。

总体说来,GBK包括所有的汉字,包括简体和繁体。而gb2312则只包括简体汉字。

GBK:   汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号,   21003个汉字及提供了1894个造字码位。   Microsoft简体版中文Windows   95就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。

GB码,全称是GB2312-80《信息交换用汉字编码字符集 基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码, Windows 95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。



GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。



那么如何查看txt的编码呢,教你一个笨笨的办法:打开文件——另存为,然后看到最下面的编码,默认选择的就是当前文档的编码格式)。

txt文本文档有四种编码选项:ANSI、Unicode、Unicode big endian、UTF-8;默认应该是ANSI选项,就是系统的默认编码,一般是GBK。

因此我们读取txt文件可能有时候并不知道其编码格式,所以需要用程序动态判断获取txt文件编码,这里给一点资料,参考参考: 

ANSI: 无格式定义 

Unicode:  前两个字节为FFFE Unicode文档以0xFFFE开头

Unicode big endian: 前两字节为FEFF 

UTF-8: 前两字节为EFBB UTF-8以0xEFBBBF开头

用程序取出前几个字节并进行判断即可。



首先对java中得编码格式进行了研究。发现在java中

java编码与txt编码对应
java txt
unicode unicode big endian
utf-8 utf-8
utf-16 unicode
gb2312 ANSI


java读取txt文件,如果编码格式不匹配,就会出现乱码现象。所以读取txt文件的时候需要设置读取编码。txt文档编码格式都是写在文件头的,在程序中需要先解析文件的编码格式,获得编码格式后,在按此格式读取文件就不会产生乱码了。





代码示例如下:





Java代码  收藏代码
package com.lfl.attachment; 
 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
 
public class TextMain { 
 
    public static void main(String[] args) throws Exception { 
        String filePath = "D:/article.txt"; 
//      String filePath = "D:/article333.txt";   
//      String filePath = "D:/article111.txt";   
        String content = readTxt(filePath); 
        System.out.println(content); 
         
    } 
 
     
     
    /**
     * 解析普通文本文件  流式文件 如txt
     * @param path
     * @return
     */ 
    @SuppressWarnings("unused") 
    public static String readTxt(String path){ 
        StringBuilder content = new StringBuilder(""); 
        try { 
            String code = resolveCode(path); 
            File file = new File(path); 
            InputStream is = new FileInputStream(file); 
            InputStreamReader isr = new InputStreamReader(is, code); 
            BufferedReader br = new BufferedReader(isr); 
//          char[] buf = new char[1024]; 
//          int i = br.read(buf); 
//          String s= new String(buf); 
//          System.out.println(s); 
            String str = ""; 
            while (null != (str = br.readLine())) { 
                content.append(str); 
            } 
            br.close(); 
        } catch (Exception e) { 
            e.printStackTrace(); 
            System.err.println("读取文件:" + path + "失败!"); 
        } 
        return content.toString(); 
    } 
     
     
     
    public static String resolveCode(String path) throws Exception { 
//      String filePath = "D:/article.txt"; //[-76, -85, -71]  ANSI 
//      String filePath = "D:/article111.txt";  //[-2, -1, 79] unicode big endian 
//      String filePath = "D:/article222.txt";  //[-1, -2, 32]  unicode 
//      String filePath = "D:/article333.txt";  //[-17, -69, -65] UTF-8 
        InputStream inputStream = new FileInputStream(path);   
        byte[] head = new byte[3];   
        inputStream.read(head);     
        String code = "gb2312";  //或GBK 
        if (head[0] == -1 && head[1] == -2 )   
            code = "UTF-16";   
        else if (head[0] == -2 && head[1] == -1 )   
            code = "Unicode";   
        else if(head[0]==-17 && head[1]==-69 && head[2] ==-65)   
            code = "UTF-8";   
           
        inputStream.close(); 
         
        System.out.println(code);  
        return code; 
    } 
     



注意:在resolveTxt方法中不能通过readTxt方法传InputStream流 ,这样会使两个方法持有同一个流引用,而在resolveTxt方法中已读过流中的三个字节,流中的pos此时已经是3了,而不是流的起始位置,再在readTxt中读取时就会出现IOException:Read Error。
分享到:
评论

相关推荐

    java读取txt文件乱码解决方案

    java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt文件乱码解决方案java读取txt...

    Java读取TXT文本文件乱码解决方案.doc

    "Java读取TXT文本文件乱码解决方案" Java 读取 TXT 文本文件乱码解决方案中,主要讨论的是在 Java 中读取 TXT 文本文件时出现乱码的问题,并提供了解决方案。 首先,文章中提供了一个简单的读取 TXT 文件的代码,...

    java读写csv文件,中文乱码问题

    下面我们将深入探讨如何在Java中正确地读取和写入CSV文件,以及解决中文乱码的问题。 1. **字符编码的理解**: - 在处理中文字符时,必须确保使用正确的字符编码,例如UTF-8。UTF-8是一种广泛支持的编码格式,可以...

    彻底解决JAVA读取写入 TXT中文乱码问题 源码

    在Java编程中,读取和写入TXT文件时,经常遇到中文乱码的问题。这是因为Java默认的字符编码可能与TXT文件的实际编码不一致,导致字符无法正确解析。本篇文章将深入探讨这个问题,并提供完整的源码解决方案。 首先,...

    java读取txt文件内容(java快速读取,程序已调试通)

    java读取txt文件,可以以文件路径构造这个流,:FileInputStream fin = new FileInputStream("d:/test.txt"); 然后使用这个流直接读取到文件,再使用reader构造BufferedReader,按行读取一整行的文本,作为字符串返回...

    c++ 读写txt文件和乱码问题解决

    下面将详细讨论如何在C++中正确地读写TXT文件以及如何解决可能出现的乱码问题。 首先,我们来看C++如何读取TXT文件。C++标准库提供了`fstream`类来处理文件操作,包括`ifstream`(输入文件流)和`ofstream`(输出...

    Java读取TXT文件.txt

    ### Java读取TXT文件知识点详解 #### 一、导入必要的包 在Java程序中,我们需要首先导入处理文件读写的必要类库。在这个示例中,我们看到了`import java.io.*;`这一行代码,它表明了该程序将使用Java标准库中的`...

    java读写文件避免中文乱码.docx

    Java 读写文件避免中文乱码 Java 语言在读写文件时,经常会 gặp到中文乱码的问题。这是因为 Java 默认使用的字符编码是 ISO-8859-1,而中文字符在这个编码中无法正确地表示。为了避免中文乱码,需要使用正确的...

    java读取文件中文乱码

    在Java编程中,读取包含中文字符的文件时可能会遇到乱码问题,这通常是由于编码格式不匹配导致的。要解决这个问题,我们需要理解文件的原始编码格式,并在Java代码中正确地设置字符集。以下是一些相关的知识点: 1....

    java读取txt文件代码

    从给定的文件信息来看,主要关注点在于Java读取TXT文件的代码示例,以及如何处理和操作从TXT文件中读取的数据。下面将详细解释这一知识点。 ### Java读取TXT文件的基本流程 在Java中,读取TXT文件通常涉及以下几个...

    java创建TXT文件并进行读、写操作(代码)

    ### Java创建TXT文件并执行读写操作:详细解析与代码示例 在现代软件开发中,文件处理是一项基本且重要的任务。Java作为一种广泛使用的编程语言,提供了强大的API来支持文件的创建、读取、写入以及修改等操作。本文...

    java读取txt文件

    使用java语言,通过调用FileReader类读取txt文件中的数据。资源是可直接实现的代码。

    Java读取TXT文本文件乱码解决方案.pdf

    Java 读取 TXT 文本文件时遇到乱码问题通常是由于编码格式不匹配导致的。在 Java 中,当读取文本文件时,默认使用的是平台的默认编码,这在处理某些特定编码的文件时可能会引发乱码。以下是针对这个问题的详细解释和...

    解决Labview中关于读取txt文本文件,读出来是乱码的问题

    解决Labview中关于读取txt文本文件,读出来是乱码的问题

    java读取txt文件,生成csv文件

    环境:eclipse3.7.2 jre1.6

    java读取txt文档的

    根据提供的文件信息,我们可以总结出以下关于Java读取TXT文档的知识点: ### 一、导入必要的包 在Java中读取文件之前,首先需要导入一些必要的包,这些包提供了处理文件的基本工具。在这个例子中,涉及到的包有: ...

    彻底解决android读取中文txt的乱码(自动判断文档类型并转码

    在Android平台上,开发人员经常遇到一个棘手的问题,那就是如何正确地读取包含中文字符的TXT文件,因为不恰当的处理往往会导致乱码。本文将深入探讨如何彻底解决这一问题,包括自动判断文档编码类型以及进行转码操作...

    用java编程将txt文件数据导入oracle

    在本程序中,我们使用 Java 语言的 BufferedReader 类来读取 TXT 文件中的数据。 3. Oracle 数据库:Oracle 数据库是一种关系数据库管理系统,广泛应用于企业软件开发、数据分析等领域。在本程序中,我们使用 Java ...

Global site tag (gtag.js) - Google Analytics