2011-08-01 81 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); 
}