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

01版

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

*我使用的是 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版

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

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

03版

我正在阅读的文件在被另一个程序修改后被提供给我(除了它是用 VB 制作的之外,我对此一无所知),该程序使阿拉伯字母出现不正确。当我在 Notepad++ 上检查文件的编码时,它显示它是 ANSI。但是,当我将其转换为 UTF8(将阿拉伯字母替换为其他英文字母)然后将其转换回 ANSI 时,阿拉伯语变成了问号!

4

3 回答 3

24

FileReader文档

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

所以:

Reader reader = new InputStreamReader(new FileInputStream(fileName), "utf-8");
BufferedReader br = new BufferedReader(reader);

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

更新:在上面的代码中替换utf-8cp1256. 这对我来说很好(WinXP,JDK6)

但我建议您坚持使用 UTF-8 生成文件。因为cp1256对中国人不起作用,你会再次遇到类似的问题。

于 2010-02-14T06:39:36.483 回答
2

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

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

于 2010-02-14T06:33:49.343 回答
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();
    }
}
于 2010-10-12T10:01:40.940 回答