2016-12-24 19 views
1

После нескольких часов проб и ошибок и многих других израсходованных обходов в Интернете для решений я в настоящее время полностью проигрываю.OkHttp - ISO-8859-1 закодированная веб-страница - включена в восстановленную исходную строку страницы

я успешно использую OkHttp получить источник веб-страницы следующим образом:

Request request = new Request.Builder() 
     .url(APIURL + Integer.toString(StopIndex) + "/") 
     .addHeader("Content-Type", "text/html; charset=ISO-8859-1") 
     .build(); 
client.newCall(request).enqueue(new Callback() { 
    @Override 
    public void onFailure(Call call, IOException e) { 
     Log.e("OkHttp request issue", e.toString()); 
    } 

    @Override 
    public void onResponse(Call call, Response response) throws IOException { 
     PageSource = response.body().string(); 
     StopActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       tv1.setText(PageSource); 
      } 
     }); 
    } 
}); 

Для тестирования я отображающее загруженный строки в TextView, и я заметил, «» знаки в тех местах, где были использованы специальные специальные письма («ä», «ö» и т. д.). Я понял, что это проблема с кодировкой UTF-8 < -> ISO-8859-1, поскольку источник не использовал «& auml;» или подобные, а просто «ä» и в самом деле целевая веб-страница определяет следующее:

<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" /> 

Затем я попытался включить свойство «AddHeader» в пределах Request.Builder(), но ничего с не изменится вывод. Я продолжал пробовать странные вещи с помощью перехватчиков OkHttp и ByteBuffers, но ничего не работало для меня, так как я никогда не мог получить ответ, прежде чем он был перекодирован и представлен s.

Как я могу сказать OkHttp уважать кодировку ISO-8859-1 и не допускать замены всех специальных символов («ä», «ö», «ü» и т. Д.) С помощью ?

Большое спасибо заранее и веселого Рождества для всех вас.

EDIT/ОТВЕТ:

Использование библиотеки Guava от Google я был в состоянии восстановить правильно закодированный исходный код страницы следующим образом:

String pageSource = CharStreams.toString(new InputStreamReader(response.body().byteStream(), "ISO-8859-1")); 

ответ

1

OkHttp не разобрать ваш HTML, чтобы прочитать тип содержимого внутри него. Вместо этого вам нужно указать charset самостоятельно как аргумент string(). Еще лучше, чтобы ваш сервер включил правильную кодировку в заголовок типа содержимого ответа.

+0

Ваш ответ заставил меня обнаружить концепцию charStream в OkHttp, которая затем заставила меня открыть CharStreams (как часть библиотеки Guava Guogles guava). Это, в свою очередь, заставило меня обнаружить (много открытий, duh) этот красивый фрагмент кода: «String stringFromStream = CharStreams.toString (новый InputStreamReader (response.body(). ByteStream()», UTF-8/ISO-8859-1 "));". Используя это, я смог получить правильно закодированный источник страницы в виде строки. Ваш ответ, вероятно, имел в виду что-то еще, но, тем не менее, здесь принят ваш ответ. – 1sm3t

+1

Или 'response.body(). Source(). ReadString (Charset.forName (" ISO-8859-1 "))' –