为什么Java的BufferedReader()不能正确读取阿拉伯语和中文字符?

11

我试图读取一个文件,每行都包含英文和阿拉伯文字符以及另一个文件,每行都包含英文和中文字符。但是阿拉伯文和中文的字符显示不正确 - 它们只显示为问号。有什么想法可以解决这个问题吗?

以下是我用于读取的代码:

try {
        String sCurrentLine;
        BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile));
        int counter = 0;

        while ((sCurrentLine = br.readLine()) != null) {
            String lineFixedHolder = converter.fixParsedParagraph(sCurrentLine);
            System.out.println("The line number "+ counter
                               + " contain : " + sCurrentLine);
            counter++;
        }
    }

第一版

读取行并获取阿拉伯和中文单词后,我使用一个函数通过在一个包含所有期望单词的 ArrayList 中搜索“给定的阿拉伯文本”(使用indexOf()方法)来翻译它们。然后,当找到单词的索引时,就会用它调用另一个 Arraylist 中具有相同索引的英文单词。然而,这种搜索总是返回 false,因为它在搜索问号而不是阿拉伯和中文字符时失败了。因此,我的 System.out.println 打印出 nulls,每个失败的翻译都有一个。

* 我正在使用 Netbeans 6.8 Mac 版 IDE


第二版

以下是搜索翻译的代码:

        int testColor = dbColorArb.indexOf(wordToTranslate);
        int testBrand = -1;
        if ( testColor != -1 ) {
            String result = (String)dbColorEng.get(testColor);
            return result;
        } else {
            testBrand = dbBrandArb.indexOf(wordToTranslate);
        }
        //System.out.println ("The testBrand is : " + testBrand);
        if ( testBrand != -1 ) {
            String result = (String)dbBrandEng.get(testBrand);
            return result;
        } else {
            //System.out.println ("The first null");
            return null;
        }

我正在搜索可能包含所需翻译单词的两个ArrayList。如果在两个ArrayList中都找不到它们,则返回null。


第03版

当我进行调试时,我发现读取的行以以下方式存储在我的String变量中:

 "3;0000000000;0000001001;1996-06-22;;2010-01-27;����;;01989;������;"

第三版

我正在阅读的文件是由另一个程序修改后给我的(除了它是用VB编写的,我对它一无所知),该程序使未能正确显示的阿拉伯字母得以显示。当我在Notepad++上检查文件的编码时,显示它是ANSI编码。但是,当我将它转换为UTF8编码(这替换了阿拉伯字母为其他英文字母),然后再将其转换回ANSI编码时,阿拉伯字母变成了问号!


1
那么问题是,你正在读取的文件的编码是什么?它是UTF-8吗? - Bozho
1
例如,下载Notepad++并查看它说了什么。顺便问一下,你是否设置了-Dfile.encoding=UTF-8 VM参数,就像我在我的答案中提到的那样? - Bozho
1
它被称为ISO-8859-1。但它不能包含阿拉伯符号。我重复一下关于VM参数的问题。 - Bozho
1
请将文件上传至某个地方,以便我能够查看它。 - Bozho
1
我看不到任何阿拉伯字符,所以我认为它是损坏的(这是合理的,因为它是ANSI编码)。如果是这样的话,请要求一个UTF-8编码的文件。 - Bozho
显示剩余15条评论
3个回答

24

FileReader javadoc:

这是用于读取字符文件的便捷类。该类的构造函数假定默认的字符编码和默认的字节缓冲区大小是适当的。如果想要自己指定这些值,请在FileInputStream上构造一个InputStreamReader

所以:

Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8");
BufferedReader br = new BufferedReader(reader);
如果这仍然不起作用,那么可能是您的控制台未设置为正确显示UTF-8字符。配置取决于使用的IDE,并且非常简单。
更新:在上面的代码中,将utf-8替换为cp1256。这对我来说很有效(WinXP,JDK6)。
但我建议您坚持使用UTF-8生成文件,因为cp1256对于中文无效,您将再次遇到类似的问题。

我遇到了一个错误:“不兼容的类型 - 需要:java.io.FileReader 找到:”java.io.InputStreamReader“。 - M. A. Kishawy
1
你从哪里获取的?只需复制我更新后的答案中的两行。 - Bozho
1
然后检查我回答的另一部分,并告诉我你正在使用哪个 IDE(如果你在使用一个)。 - Bozho
我仔细检查了文件,它没有损坏……我的意思是在我试过的大多数电脑上都正常显示。请检查包含数据的照片链接。 Mac:http://www.4shared.com/file/221863564/381bfd08/text-Mac.html PC:http://www.4shared.com/file/221862075/e8705951/text-Windows.html - M. A. Kishawy
@Bozho 非常感谢。如果这仍然无法解决问题,那么可能是您的控制台未正确设置以显示UTF-8字符。配置取决于所使用的IDE,并且相当简单。这就是问题所在。 - Muhammad Babar
显示剩余4条评论

2

IT很可能正确地读取了信息,但您的输出流很可能不是UTF-8格式,因此任何无法在输出字符集中显示的字符都将被替换为“?”。

您可以通过获取每个字符并打印字符序数来确认这一点。


0
public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

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