2016-09-16 2 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);   

그러나 텍스트가 모두 깨진 등장 내가 봤 마지막 텍스트가 ISO-에 추측 8859_1, InputStreamReader의 인코딩을 ISO-8859_1로 변경했지만 텍스트가 계속 왜곡되어 보입니다. 내가 봤 및

마침내 텍스트 뷰 코드를 수정하면 실제로

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

내 질문은, 1. 왜 inputStreamReader의 캐릭터 세트가 작동하지 않았다 변화 작동하는 것을 발견? 또한 2. 텍스트보기 변경이 왜 효과가 있었는지 이해할 수 없습니다. 텍스트는 UTF-8 형식으로 읽혀 졌으므로 ISO-8859를 사용하여 텍스트를 바이트로 변환 한 다음 UTF-8로 다시 인코딩하는 이유는 무엇입니까?

누군가가 그것에 대해 밝힐 수 있습니까? 또는 무슨 일이 일어나고 있는지 이해하기 위해 읽을 수있는 텍스트 일 ​​수도 있습니다.

답변

0

InputStreamReader은 기본 InputStream에서 바이트를 읽고 사용자가 제공 한 charset을 사용하여 디코딩을 시도합니다. 문제가되는 것은 InputStream 자체가 UTF-8로 인코딩된다는 것입니다. 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로 데이터를 반환해야합니다.

관련 문제