代码之家  ›  专栏  ›  技术社区  ›  Brian Deterling

为什么Java BuffelDead()不正确读取阿拉伯文和汉字?

  •  10
  • Brian Deterling  · 技术社区  · 6 年前

    我正在读一个文件,每行包含英文和阿拉伯字符,每行包含英文和中文字符。然而,阿拉伯语和汉语的字符没有正确显示-它们只是作为问号出现。我知道怎么解决这个问题吗?

    这是我用来阅读的代码:

    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();方法)。然后当单词的索引被找到时,它被用来调用在另一个数组列表中具有相同索引的英语单词。但是,这个搜索总是返回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;
            }
    

    我实际上在搜索两个数组列表,其中可能包含要翻译的单词。如果在两个ArrayList中都找不到它们,则返回空值。


    版本03

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

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

    第03版

    我正在阅读的文件在被另一个程序修改后被提供给我(除了它是用vb制作的之外我什么都不知道),这个程序生成了不能正确显示的阿拉伯字母。当我在记事本上检查文件的编码时,发现它是ANSI。然而,当我把它转换成utf8(用其他英文字母替换了阿拉伯字母)然后再转换回ansi时,阿拉伯语就变成了问号!

    3 回复  |  直到 10 年前
        1
  •  23
  •   Bozho    15 年前

    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 不会为中国人工作,你会再次遇到类似的问题。

        2
  •  2
  •   Paul Wagland    15 年前

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

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

        3
  •  0
  •   Ahmad Alhaj Hussein    14 年前
    public void writeTiFile(String fileName,String str){
        try {
            FileOutputStream out = new FileOutputStream(fileName);
            out.write(str.getBytes("windows-1256"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }