2016-09-16 21 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形式返回数据,以避免客户端上不必要的工作

相关问题