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

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

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解码,不用再做编码转换。

public static List<String> getLines(String fileName){
        List<String> lines=new ArrayList<String>();
        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),"UTF-8"));
            String line = null;
            while ((line = br.readLine()) != null) {
                lines.add(line);
            }
            br.close();
        } catch (FileNotFoundException e) {
        }catch (IOException e) {}
        return lines;
    }

FileReader读取中文txt文件编码丢失问题(乱码)(转),布布扣,bubuko.com

时间: 2024-12-08 19:50:59

FileReader读取中文txt文件编码丢失问题(乱码)(转)的相关文章

Python读取中文txt文件错误:UnicodeEncodeError: &#39;gbk&#39; codec can&#39;t encode character

1 with open(file,'r') as f: 2 line=f.readline() 3 i=1 4 while line: 5 line=line.decode('utf-8') 6 print str(i)+": "+line7 line=f.readline() 8 i=i+1 用以上代码读取一个包含中文的txt文件时,在正确地读取并打印了六百多行之后,print str(i)+": "+line这一行报错: UnicodeEncodeError:

Java基础-输入输出-2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

2.编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt package Test03; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import jav

转 :Vim文件编码识别与乱码处理

Vim文件编码识别与乱码处理 在 Vim 中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding 和 termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱码.因此,每一个 Vim 用户都应该明确这四个选项的含义.下面,我们详细介绍一下这四个选项的含义和作用. 1 encoding www.2cto.com encoding 是 Vim 内部使用的字符编码方式.当我们设置了 encoding 之后,Vim 内部所有的 bu

Java读取UTF-8格式文件第一行出现乱码——问号“?”及解决 And Java读带有BOM的UTF-8文件乱码原因及解决方法

测试例子: Java读取UTF-8的txt文件第一行出现乱码"?"及解决 test.txt文件内容: 1 00:00:06,000 --> 00:00:06,010 <b>Allerleirauh</b> (2012) <i>dTV - Das Erste - 20. Januar 2013</i> 2 00:00:10,280 --> 00:00:12,680 Was geh?rt zu einer guten Suppe?

C#控制台基础 streamreader 中的readline方法读取指定txt文件的第一行

1.代码 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApplication4 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 {

C#控制台基础 streamreader 中的readline方法读取指定txt文件的所有行

1.代码 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApplication4 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 {

C#控制台基础 streamreader 中的readtoend方法读取指定txt文件

1 代码 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.Linq; 5 using System.Text; 6 using System.Threading.Tasks; 7 8 namespace ConsoleApplication4 9 { 10 class Program 11 { 12 static void Main(string[] args) 13 {

编写IoDemo.java的Java应用程序,程序完成的功能是:首先读取text.txt文件内容,再通过键盘输入文件的名称为iodemo.txt,把text.txt的内容存入iodemo.txt

package zuoye; import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream; public class IoDemo { public static void main(String[] args) { File file = new File("d:/zuoye"); if(!file.exists()) { file.mkdirs(); } File f=new

php 读取修改txt文件

//txt文件中只有一行数据 读 $fp = fopen("password.txt", "r"); if($fp) { $pwd = fgets($fp); } else { echo "打开文件失败"; } fclose($fp); //txt文件中只有一行数据 写 1 $fp = fopen("password.txt", "w");//文件被清空后再写入 2 if($fp) 3 { 4 $flag=