2016-09-16 22 views
0

我需要在文本視圖中顯示url中的內容。這個網址的內容只是非英文語言中的純文本(無元數據)。我讀的InputStreamReader使用使用UTF-8編碼的內容,如何在Android設備上顯示ISO-8859編碼的文本

URL url = new URL(url); 
URLConnection urlConnection = url.openConnection(); 
inputStream = new BufferedInputStream(urlConnection.getInputStream()); 
BufferedReader reader = new BufferedReader(new InputStreamReader(
         urlConnection.getInputStream(), "Charset.forName(UTF-8")); 
StringBuilder sb = new StringBuilder(); 
String line; 
while ((line = reader.readLine()) != null) { 
    sb.append(line); 
} 
return sb.toString(); 

文本顯示代碼:

textView.setText(text);   

但文本出現全是亂碼,我用Google搜索,終於猜對文本是ISO- 8859_1,因此我將InputStreamReader中的編碼更改爲ISO-8859_1,但文本仍然顯示爲亂碼。

我用Google搜索,終於發現,修改TextView的代碼實際工作

textView.setText(new String(text.getBytes("ISO-8859-1"), "UTF-8")); 

我的問題是,1.爲什麼改變InputStreamReader的字符集沒有工作? 另外,2.我不明白爲什麼文本視圖更改工作。文本是以UTF-8格式讀取的,爲什麼我們使用ISO-8859將文本轉換爲字節,然後再以UTF-8編碼呢?

有人可以對此有所瞭解嗎?或者可能是一些我可以閱讀的文字來理解正在發生的事情。

回答

0

InputStreamReader從底層InputStream中讀取字節,並嘗試使用您提供的字符集對它們進行解碼。什麼似乎是你的問題是InputStream本身編碼爲UTF-8,這是由服務器和你的HTTP客戶端同意使用它的結果。因此,如果您有一個ISO-8859-1字符串,並且您通過此通道發送,則其字節將以UTF-8編碼(再次),從而導致實際消息被雙重編碼。

bytes = encode(encode("ISO-8859-1", "string"), "UTF-8"); 

爲了字符串解碼,必須先撤消UTF-8編碼(通過new InputStreamReader(urlConnection.getInputStream(), Charset.forName("UTF-8")),然後通過new String(text.getBytes("ISO-8859-1"), "UTF-8")撤消ISO-8859-1編碼了。

你或許可以看到,如果原始內容已經以UTF-8提供,則最後一步將不再需要,因此如果您還可以訪問服務器代碼,則應該使其以UTF-8形式返回數據,以避免客戶端上不必要的工作

相關問題