1

您好,我正在尝试在我的 android 应用程序上读取带有希伯来字符的 UTF-8 编码的 txt 文件,现在由于某种原因进行了管理后,'a' 字符总是附加在我读取的字符串的开头。我想知道为什么

这是我的代码:

        void Read(){
        try {
            File fileDir = new File("/sdcard/test.txt");

            BufferedReader in = new BufferedReader( new InputStreamReader(
                          new FileInputStream(fileDir), "UTF8"));

            String str;

            while ((str = in.readLine()) != null) {
                    Log.i("TEST",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());
            }
        }

这是我得到的结果

05-15 01:53:25.269:信息/测试(16236):אבגדהוזחטיכלמנסעפצקרשת a

4

1 回答 1

2

为了得到更好的答案,我需要回答两个问题:

  • 有问题的字符(您的“a”)的确切代码点是什么?
  • 您文件中可疑区域周围的确切字节序列是什么?

我要在这里猜测一下:您说字符是文件中的第一件事(“附加在字符串的开头”),并且您在阿拉伯语表示形式 B 块中取回了它。阿拉伯语表示形式 B 的最后一个字符,奇怪的是与阿拉伯语无关,是 U+FFEF,或字节顺序标记 (BOM)。它通常出现在 UTF-16 或 UTF-32 编码文件的开头,并标识编码的“字节顺序”(文件是 UTF-16LE 还是 UTF-16BE 编码,对于 UTF-32 也是如此)。但是,它通常不会出现在 UTF-8 数据中,因为 UTF-8 没有“字节顺序”的概念。也就是说,一些脑残的 Windows 程序会把它粘在那里,然后有一个额外的选项“UTF-8 without BOM”。

如果这是您的问题,并且您的文件是真正以 UTF-8 编码的,您应该能够在文件开头附近找到以下字节序列:EF BB BF— 这是 U+FFEF 的 UTF-8 表示。

于 2011-05-19T08:22:52.767 回答