使用Java读取UTF-8编码的文本文件

31

我在使用Java和Netbeans 7.2.1平台时,遇到了读取UTF-8编码文本文件的问题。

我已经将Java项目配置为处理UTF-8:javaproject==>右键单击==>属性==>源==>UTF-8

但仍然出现了未知字符输出:

����� �������� ���� �

代码如下:

File fileDirs = new File("C:\\file.txt");

BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream(fileDirs), "UTF-8"));

String str;

while ((str = in.readLine()) != null) {
    System.out.println(str);
}

还有其他的想法吗?

谢谢


System.out 的编码是什么?你的系统编码是什么? - Mike Samuel
你确定输入文件是UTF-8编码的吗? - Henry
3
感谢大家留下的评论。我已经找到了解决问题的方法。原来的文本文件是ANSI编码的,其中包含阿拉伯字符。因此,解决方法是使用以下代码:BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(fileDirs), "windows-1256"));--再次感谢大家。 - Abrial
5个回答

43
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;     
    public class test {
    public static void main(String[] args){

    try {
        File fileDir = new File("PATH_TO_FILE");

        BufferedReader in = new BufferedReader(
           new InputStreamReader(new FileInputStream(fileDir), "UTF-8"));

        String str;

        while ((str = in.readLine()) != null) {
            System.out.println(str);
        }

                in.close();
        } 
        catch (UnsupportedEncodingException e) 
        {
            System.out.println(e.getMessage());
        } 
        catch (IOException e) 
        {
            System.out.println(e.getMessage());
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
}

你需要将UTF-8放在引号中


1
在 catch 之前放置 in.close 是一种不良实践。应该在 finally 块中处理。Java 8 还可以使用多重 catch 格式。 - tgkprog

12

您需要使用Charset参数来指定InputStreamReader的编码。

Charset inputCharset = Charset.forName("ISO-8859-1");
InputStreamReader isr = new InputStreamReader(fis, inputCharset));

这对我来说是工作。我希望能帮助你。


你是冠军!谢谢,兄弟 :) - Martin Pfeffer
Lg g3可以使用utf-8,但不支持ISO-8859-1,而我的ASUS可以使用ISO-8859-1,但不支持utf-8... - user3402040

10
您正在正确读取文件,但问题似乎出现在 System.out 的默认编码上。尝试使用以下代码打印 UTF-8 字符串:

您正在正确读取文件,但问题似乎出现在 System.out 的默认编码上。尝试使用以下代码打印 UTF-8 字符串:

PrintStream out = new PrintStream(System.out, true, "UTF-8");
out.println(str);

4

每次遇到特殊字符都会出现问题,标记为�。为了解决这个问题,我尝试使用编码:ISO-8859-1。

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("txtPath"),"ISO-8859-1"));

while ((line = br.readLine()) != null) {

}

我希望这篇文章可以帮助到看到它的所有人。

代码中没有设置 ISO-8859-1 编码。编码使用的是默认值。 - fantaghirocco

4

好的,我明显来晚了,但如果你仍在寻找最佳解决方案,我建议使用以下代码(适用于Java 8):

    Charset inputCharset = Charset.forName("ISO-8859-1");
    Path pathToFile = ....
    try (BufferedReader br = Files.newBufferedReader( pathToFile, inputCharset )) {
        ...
     }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接