我刚刚发现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)无法正确解码中文字符。那么,我该怎么做?提前谢谢。
答案 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个字节。