`

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

阅读更多

因为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文档编码格式都是写在文件头的,在程序中需要先解析文件的编码格式,获得编码格式后,在按此格式读取文件就不会产生乱码了。

 

 

代码示例如下:

 

 

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。

 

 

分享到:
评论
3 楼 H4X0R 2014-04-12  
else if(head[0]==-17 && head[1]==-69 && head[2] ==-65)    这段代码实际上是判断的UTF-8编码格式的文本文件是否有BOM头EF BB BF,如果是用notepad++生成的文本文件编码格式为UTF-8无BOM头,那样你这段代码会将该文本文件误认为编码格式为GB2312
2 楼 lfl2011 2013-08-23  
dove19900520 写道
没看到你的code值是在哪用的啊?


不好意思 之前写成GBK 没有改 应是下面的一行
InputStreamReader isr = new InputStreamReader(is, code);
1 楼 dove19900520 2013-08-23  
没看到你的code值是在哪用的啊?

相关推荐

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

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

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

    要解决Java读取TXT文件中文乱码的问题,关键在于指定正确的编码方式。以下是使用`BufferedReader`和`FileReader`读取UTF-8编码的TXT文件的示例: ```java import java.io.BufferedReader; import java.io....

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

    总之,Java 读取 TXT 文件乱码的解决方案在于确定文件的正确编码,并在读取时指定该编码。通过使用 `InputStreamReader` 并传递正确的编码字符串,可以有效地解决这类问题。同时,了解各种编码格式的特点以及如何...

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

    2. **Java读取CSV文件**: - 使用`BufferedReader`和`InputStreamReader`组合,可以指定字符编码读取文件。例如: ```java FileInputStream fis = new FileInputStream("path_to_file.csv"); InputStreamReader ...

    java读取远程网页乱码解决方案

    总之,解决Java读取远程网页乱码问题的关键在于正确识别和使用网页的字符编码。通过设置请求头、使用特定的API或第三方库,以及处理响应头中的`Content-Type`信息,可以有效地避免乱码问题。同时,编写健壮的代码,...

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

    Java 读取 TXT 文本文件时遇到乱码问题通常是由于编码格式不匹配导致的。在 Java 中,当读取文本文件时,默认使用的是平台的默认编码,这在处理非 ASCII 字符时可能会出现问题,尤其是当文件采用不同编码(如 UTF-16...

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

    通过以上步骤,我们可以实现一个相对完整的读取中文TXT文件的解决方案,即使文件编码未知,也能自动判断并转换,避免乱码问题。在实际开发中,建议结合具体需求选择合适的方法,确保代码的稳定性和效率。 当然,...

    java 逐行读取txt文本如何解决中文乱码

    java读取txt文本中如含有中文,可能会出现乱码,解决方案是: 1.要统一编码,java工程的编码,txt文本编码,java工程中的java文本编码都统一为utf-8; 2.利用 InputStreamReader(new FileInputStream(fileUrl), ...

    Java中文乱码浅析及解决方案

    本文将深入探讨这一问题,并提供相应的解决方案。 首先,我们要理解Java编译器编码与运行环境编码的差异。Windows系统通常使用GBK或GB2312作为默认字符编码,而Linux系统倾向于使用UTF-8。如果Java程序在Windows...

    Java读取中文文件出现乱码解决过程.mht

    总之,解决Java读取中文文件乱码的关键在于确定正确的文件编码并相应地调整Java代码。同时,良好的编码规范,如统一项目编码为UTF-8,可以避免很多不必要的问题。在实际开发中,应当养成检查文件编码的习惯,避免因...

    Java读写xml,word,xml文件(防乱码)

    ### Java读写XML、Word与TXT文件:去除乱码问题详解 #### 一、引言 在实际开发过程中,我们经常需要处理各种类型的文件,包括XML、Word文档以及普通的文本文件(如TXT)。这些文件在读写过程中经常会遇到乱码问题,...

    java 解析csv文件例子,csv文件 中文乱码问题

    你可以尝试以下几种解决方案: 1. **确定正确的编码**:确认CSV文件的实际编码。可以使用一些工具,如Notepad++,查看或更改文件的编码。 2. **使用`CharsetDetector`**:如果不确定编码,可以使用Apache Commons ...

    java乱码解决方案

    标题:Java乱码解决方案 描述与标签:在Java开发中,字符编码问题常常导致文本显示为乱码,尤其是在处理国际化或多语言环境时更为常见。乱码解决方案主要涉及正确设置字符编码,确保数据在输入、处理和输出过程中的...

    java读取DBF解决方案(可以解决javadbf.jar对DBF部分中文乱码和错行等杂症)

    //这里连接的是student数据源配置的java语句 private Connection conn = null; private Statement stmt = null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver搜索"); conn = DriverManager.getConnection...

    java文件JSP文件乱码汇总

    本文将深入探讨Java与JSP文件乱码的问题,提供一系列解决方案,确保数据正确无误地在不同平台和系统之间传递。 #### 一、统一字符集设置 **问题描述**:在项目开发中,由于Java默认使用UTF-8编码,但在实际操作中...

    JSP乱码解决方案

    本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...

    Java读取资源文件时内容过长与换行的处理

    ### Java读取资源文件时内容过长与换行的处理 在Java开发过程中,经常会遇到需要读取资源文件的情况,比如配置文件、属性文件等。这些文件中的内容有时会非常长,或者为了提高可读性,需要进行换行处理。本文将详细...

Global site tag (gtag.js) - Google Analytics