在Android上读取Windows Unicode文件

在Android上读取Windows Unicode文件,android,unicode,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)); Strin

我刚刚发现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卡,并使用以下程序读取它们:(注意,Emulator的区域设置已经设置为zh_TW)

很明显,Android(或Java)无法正确解码汉字。那么,我该怎么做呢?提前谢谢

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

BufferedReader in = new BufferedReader(new FileReader(pathname));
String str = in.readLine();
您是如何获得长度的?您所描述的对于Java
字符串是绝对正确的。Java字符串是UTF-16(即Unicode)。这意味着
ABC
将完全按照您所描述的方式存储在Java字符串中(
0x41、0x00、0x42、0x00、0x43、0x00

但是,由
int String.length()
返回的字符串“length”将为3,即使长度为6字节

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

BufferedReader in = new BufferedReader(new FileReader(pathname));
String str = in.readLine();
您是如何获得长度的?您所描述的对于Java
字符串是绝对正确的。Java字符串是UTF-16(即Unicode)。这意味着
ABC
将完全按照您所描述的方式存储在Java字符串中(
0x41、0x00、0x42、0x00、0x43、0x00


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

文件阅读器显然认为编码将是ASCII兼容的。(可能需要UTF-8或任何旧的ASCII扩展名)

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

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

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

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

文件阅读器显然认为编码将与ASCII兼容。(可能需要UTF-8或任何较早的ASCII扩展名)

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

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

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

您还应该认真阅读-在我看来,您对字符集和编码有很多误解。

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

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

一旦您将一个包含中文单词的基于窗口的Ascii文件放入Android系统。
正常的流处理无法正确识别中文部分。

下面的代码,可以更正Windows Base Acsii文本文件中放入Android系统SD或资产文件夹的中文单词中的解析器字符串。

在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);
}

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

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

一旦您将一个包含中文单词的基于窗口的Ascii文件放入Android系统。
正常的流处理无法正确识别中文部分。

下面的代码,可以更正Windows Base Acsii文本文件中放入Android系统SD或资产文件夹的中文单词中的解析器字符串。

在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);
}

感谢response.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!(设备的区域设置已设置为中文)(续)因此,Java的FileReader似乎无法处理Unicode文件。在Android上是否仍然可以正确处理Windows Unicode文件?谢谢。谢谢您的回复。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!(设备的区域设置已设置为中文)(续)所以,Java的FileReader似乎无法处理Unicode文件。在Android上是否有正确处理Windows Unicode文件的方法?谢谢。谢谢,InputStreamReader正是我要找的