2016-09-16 15 views
0

URLからのコンテンツをテキストビューで表示する必要があります。このURLのコンテンツは、英語以外の言語でのプレーンテキスト(メタデータなし)です。私は、UTF-8エンコーディングでは、InputStreamReader使用してコンテンツを読んでいますアンドロイドデバイス上で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")); 

を働くことがわかったInputStreamReaderに文字セットを変更して動作しなかった理由私の質問は、1ですか? また、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"); 

文字列をデコードするためには、あなたが最初にnew InputStreamReader(urlConnection.getInputStream(), Charset.forName("UTF-8"))経由(UTF-8エンコーディングを元に戻す必要があり、その後、new String(text.getBytes("ISO-8859-1"), "UTF-8")を経由して、あまりにもISO-8859-1エンコーディングを元に戻すには。

おそらくことがわかります元のコンテンツがすでにUTF-8で提供されている場合は最後のステップは不要であるため、サーバーコードにもアクセスできる場合は、UTF-8でデータを返すようにして、クライアントでの不必要な作業を回避してください。

関連する問題