在Android上读取Windows Unicode文件

时间:2011-08-01 23:47:38

标签: android unicode

我刚刚发现Android可以正确读取使用Windows ANSI(或所谓的多字节编码)编码的文件,并将其转换为Java Unicode字符串。但是在读取Unicode文件时失败了。似乎Android正在以逐字节的方式读取它。文件中的Unicode字符串“ABC”将被读入长度为6的Java字符串,字符为0x41,0x00,0x42,0x00,0x43,0x00。

BufferedReader in = new BufferedReader(new FileReader(pathname));
String str = in.readLine();

请问,有没有办法在Android上正确读取Windows Unicode文件?谢谢。

[被修改]

实验:我在两个Windows文本文件中保存了两个汉字“难哪”:

ANSI.txt -- C3 F8 AD FE
UNICODE.txt -- FF FE E3 96 EA 54

然后我将这些文件放到Emulator的SD卡中,并使用以下程序读取它们:(注意,模拟器的语言环境已经设置为zh_TW)。

BufferedReader in = new BufferedReader(new FileReader("/sdcard/ANSI.txt"));
String szLine = in.readLine();
int n = szLine.length(), j, i;
in.close();
for (i = 0; i < n; i++) 
    j = szLine.charAt(i);

这是我在模拟器上看到的内容:

ANSI.txt -- FFFD FFFD FFFD
UNICODE.txt -- FFFD FFFD FFFD FFFD 0084

显然Android(或Java)无法正确解码中文字符。那么,我该怎么做?提前谢谢。

3 个答案:

答案 0 :(得分:8)

FileReader显然假设编码与ASCII兼容。 (可以期待UTF-8或任何旧的ASCII扩展)。

此外,它不是“Unicode文件” - 它是“UTF-16编码文件”。

您必须使用StreamReader并自行指定编码:

BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(pathname), "UTF-16LE"));

你也应该真正阅读that article - 在我看来,你对字符集和编码有很多误解。

答案 1 :(得分:1)

您可以尝试以下代码。
通常窗口基础Ascii文件在中文单词
中 可能是android系统下的正确进程。

通常默认在流处理中使用UTF8格式。

将中文单词中的Window基本Ascii文件放入Android系统后 普通的流程无法正确识别中文部分。

以下代码,可以从Window Base Acsii文本文件中校正解析器字符串,该文件位于放入Android System SD或Asset文件夹的中文单词中。

在InputStreamReader Ojbect中使用“BIG5”格式解码器非常简单。

我已经过验证了。它运作良好。试试吧 !!
仅供参考。 KNC。

String pathname="AAA.txt";
BufferedReader inBR;
inBR = new BufferedReader(new InputStreamReader(new FileInputStream(pathname), "BIG5"));
String sData="";

while ((sData  = inBR.readLine()) != null) {
    System.out.println(sData);
}

答案 2 :(得分:0)

  

文件中的Unicode字符串“ABC”将被读入长度为6的Java字符串,字符为0x41,0x00,0x42,0x00,0x43,0x00。

你是如何获得长度的?你所描述的对于Java String是完全正确的。 Java字符串是UTF-16(即Unicode)。这意味着ABC将完全按照您的描述(0x41, 0x00, 0x42, 0x00, 0x43, 0x00)存储在Java字符串中。

然而,int String.length()返回的字符串'length'将为3,即使它长6个字节。