`
sd8089730
  • 浏览: 261236 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
社区版块
存档分类
最新评论

FileReader读取中文txt文件编码丢失问题(乱码)

 
阅读更多
OS.有一个UTF-8编码的文本文件,用FileReader读取到一个字符串,然后转换字符集:str=new String(str.getBytes(),"UTF-8");结果大部分中文显示正常,但最后仍有部分汉字显示为问号! 

Java代码  
1.public static List<String> getLines(String fileName){   
2.        List<String> lines=new ArrayList<String>();   
3.        try {   
4.            BufferedReader br = new BufferedReader(new FileReader(fileName));   
5.            String line = null;   
6.            while ((line = br.readLine()) != null) {   
7.                lines.add(new String(line.getBytes("GBK"),"UTF-8"));   
8.            }   
9.            br.close();   
10.        } catch (FileNotFoundException e) {   
11.        }catch (IOException e) {}   
12.        return lines;   
13.    }  
public static List<String> getLines(String fileName){
		List<String> lines=new ArrayList<String>();
		try {
			BufferedReader br = new BufferedReader(new FileReader(fileName));
			String line = null;
			while ((line = br.readLine()) != null) {
				lines.add(new String(line.getBytes("GBK"),"UTF-8"));
			}
			br.close();
		} catch (FileNotFoundException e) {
		}catch (IOException e) {}
		return lines;
	}


文件读入时是按OS的默认字符集即GBK解码的,我先用默认字符集GBK编码str.getBytes(“GBK”),此时应该还原为文件中的字节序列了,然后再按UTF-8解码,生成的字符串按理说应该就应该是正确的。 

为什么结果中还是有部分乱码呢? 
问题出在FileReader读取文件的过程中,FileReader继承了InputStreamReader,但并没有实现父类中带字符集参数的构造函数,所以FileReader只能按系统默认的字符集来解码,然后在UTF-8 -> GBK -> UTF-8的过程中编码出现损失,造成结果不能还原最初的字符。 

原因明确了,这个问题解决起来并不困难,用InputStreamReader代替FileReader,InputStreamReader isr=new InputStreamReader(new FileInputStream(fileName),"UTF-8");这样读取文件就会直接用UTF-8解码,不用再做编码转换。 

Java代码  
1.public static List<String> getLines(String fileName){   
2.        List<String> lines=new ArrayList<String>();   
3.        try {   
4.            BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));   
5.            String line = null;   
6.            while ((line = br.readLine()) != null) {   
7.                lines.add(line);   
8.            }   
9.            br.close();   
10.        } catch (FileNotFoundException e) {   
11.        }catch (IOException e) {}   
12.        return lines;   
13.    }  

 

分享到:
评论

相关推荐

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

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

    Java字符编码转换过程说明

    Java字符编码转换是Java开发中一个重要的...总的来说,理解Java中的字符编码转换过程至关重要,这有助于在处理多语言和跨平台项目时避免数据丢失或乱码问题。开发者应始终关注编码的正确设置,并在必要时进行手动转换。

    Java设置String字符串编码方法详解

    在Java编程语言中,处理字符串编码是至关重要的,因为正确的编码和...理解并正确使用这些方法可以避免常见的编码问题,如乱码和数据丢失。在开发过程中,始终记住指定正确的编码,特别是在跨平台或处理多语言内容时。

    java-IO流学习使用教程

    - 当需要读取或写入包含文本内容的文件时,如.txt、.properties等,使用字符流更合适,因为它能处理字符编码,避免了字节流处理文本时可能出现的乱码问题。 - 在读取时,字符流会按字符大小进行读取,不会出现半个...

    2.java字符集.zip

    例如,从UTF-8编码的文件读取内容时,如果误认为是ISO-8859-1编码,那么某些字符将无法正确解析。 8. 国际化与本地化 Java的`java.text`包提供了一系列类支持国际化和本地化,这些类在处理日期、货币、数字以及字符...

    编码器

    不正确的编码设置可能导致乱码或数据丢失。因此,开发者需要对Unicode、ASCII、GBK等常见字符集有所了解,并熟练掌握Java中的相关API,以确保程序在各种环境下的兼容性和正确性。 总之,编码器在编程领域,特别是...

    详解Java中字符流与字节流的区别

    Java中的流是处理数据传输的一种抽象,它将数据视为字节序列进行操作。根据处理的数据单位,Java提供了两种主要类型的流:字符流和字节流。...正确选用流类型可以避免数据丢失、乱码等问题,同时优化性能。

Global site tag (gtag.js) - Google Analytics