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

为什么Java BufferedReader()不能正确读取阿拉伯语和中文字符?,java,encoding,utf-8,arabic,Java,Encoding,Utf 8,Arabic,我正在读一个文件,每行包含英语和阿拉伯语字符,另一个文件每行包含英语和中文字符。然而,阿拉伯语和汉语的字符无法正确显示——它们只是以问号的形式出现。你知道我怎样才能解决这个问题吗 以下是我用来阅读的代码: try { String sCurrentLine; BufferedReader br = new BufferedReader(new FileReader(directionOfTargetFile)); int counter = 0;

我正在读一个文件,每行包含英语和阿拉伯语字符,另一个文件每行包含英语和中文字符。然而,阿拉伯语和汉语的字符无法正确显示——它们只是以问号的形式出现。你知道我怎样才能解决这个问题吗

以下是我用来阅读的代码:

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++;
        }
    }

01版

在读了这行并得到了阿拉伯语和汉语单词之后,我使用一个函数来翻译它们,只需在ArrayList中搜索给定的阿拉伯语文本(其中包含所有预期的单词)(使用indexOf();方法)。然后,当找到单词的索引时,它被用来调用在另一个Arraylist中具有相同索引的英语单词。但是,此搜索始终返回false,因为在搜索问号而不是阿拉伯语和中文字符时失败。因此,我的System.out.println print向我显示空值,每次翻译失败一个空值


*我使用的是Netbeans 6.8 Mac版本IDE


02版

以下是搜索翻译的代码:

        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;
        }
我实际上在搜索2个ArrayList,其中可能包含需要翻译的单词。如果在两个ArrayList中都找不到它们,则返回null


03版

调试时,我发现正在读取的行存储在字符串变量中,如下所示:

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

03版


我正在阅读的文件被另一个程序修改后交给了我(除了它是用VB编写的以外,我对它一无所知)。该程序使阿拉伯字母的显示不正确。当我在Notepad++上检查文件的编码时,它显示它是ANSI。然而,当我把它转换成UTF8(它用另一个英文字母代替了阿拉伯字母),然后再转换回ANSI时,阿拉伯语变成了问号

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

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

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

因此:

如果这仍然不起作用,那么可能您的控制台没有设置为正确显示UTF-8字符。配置取决于所使用的IDE,非常简单

更新:在上述代码中,将
utf-8
替换为
cp1256
。这对我来说很好(WinXP、JDK6)


但是我建议您坚持使用UTF-8生成文件。因为
cp1256
不适用于中文,您将再次遇到类似问题。

我收到一个错误“不兼容的类型-需要:java.io.FileReader发现:”java.io.InputStreamReader“你从哪儿弄来的?只需从我更新的答案中复制两行,它正在执行…但是我仍然有相同的问题,字符显示,然后检查我答案的其他部分。请告诉我您使用的是什么IDE(如果您使用的是IDE)我使用的是Netbeans 6.8 Mac版本IDE您需要说明您试图将字符输出到的是什么,以及为其配置的输出字符集/编码是什么。给我们提供搜索
ArrayList
而不是解释它的代码如何,在调试模式下启动并跟踪程序的执行情况,以查看它与预期NYES的确切区别,但不要将其输出到控制台-查看调试器中的值。控制台包含额外的IO操作,可能会调整编码。然后问题是您正在读取的文件的编码是什么。是UTF-8吗?
public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
public void writeTiFile(String fileName,String str){
    try {
        FileOutputStream out = new FileOutputStream(fileName);
        out.write(str.getBytes("windows-1256"));
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}