2011-08-01 42 views
0

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

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

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

[编辑]

Experiements:我在两个Windows文本文件保存两个中国字 “难哪”:

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

然后我把这些文件到模拟器的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 

Apparantly的Android(或Java)不能正确解码中国汉字。那么,我该怎么做?先谢谢你。

回答

8

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

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

你将不得不使用一个StreamReader并指定编码自己:

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

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

+0

谢谢,InputStreamReader正是我正在寻找的。非常感谢。 – wwyt

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()返回将是3,即使它是6个字节长。

+0

感谢您的回应。 String.length()返回6.下面是一些更多细节:在Windows中,有一个文件,其中包含以下字节:0xff,0xfe,0x41,0x00,0x42,0x00,0x43,0x00。我把这个文件放到SD卡上并使用上面的代码来读取它,得到的Java字符串的长度是8.使用String.charAt()来分解字符串,我得到以下8个整数:0xfffd,0xfffd,0x0041,0x0000, 0x0042,0x0000,0x0043,0x0000。如果文件包含像3个中文字符这样的双字节字符,那么Java字符串的长度就会更大:7! (设备的语言环境设置为中文) – wwyt

+0

(续)所以,Java的FileReader似乎无法处理Unicoded文件。无论如何,在Android上正确处理Windows Unicoded文件?谢谢。 – wwyt

1

您可以尝试下面的代码。
通常窗口基ASCII文件,中国字内
可以不是下机器人系统的正确过程。

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

一旦你将窗口的基础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); 
}