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