Проблемы с кодировкой ответа сервера в eclipse

260
22 сентября 2017, 18:17

Из java-сервлета посылаю на сторонний web-сервер GET запрос, получаю в ответ html код, запихиваю этот код в строку. Смотрю в строку -а русские буквы в ней в виде ромбиков с вопросиками. В самом html документе кодировка нигде не указана. Поэтому вручную перекодировываю строку в UTF-8. Не помогло.

    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException  {
    String url = "http://meteonovosti.ru/index.php?index=8&value=26063";
    URL obj = new URL(url);
    HttpURLConnection connection = (HttpURLConnection) obj.openConnection();
    connection.setRequestMethod("GET");
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String inputLine;
    StringBuffer response = new StringBuffer();
    while ((inputLine = in.readLine()) != null) {
        response.append(inputLine);
    }
    in.close();
    String answer = response.toString();
    System.out.println("Оригинальный ответ: "+answer);
     answer = new String(answer.getBytes(), "UTF-8" );
     System.out.println("После перекодирования: "+answer);

Оба вывода одинаковы (пропущены куски html кода):

Оригинальный ответ: �����-��������� : ����� ������

После перекодирования: �����-��������� : ����� ������

В настройках Эклипса везде указано использовать UTF-8. Что мне нужно сделать, чтобы получить русские буквы?

Answer 1

Просто текст приходит не в UTF-8. Вы создаете строку из байтового массива, байтовый массив ничего не знает о кодировке, это просто набор байт, чтобы сделать из него строку, нужно указать кодировку

answer = new String(answer.getBytes(), "UTF-8");

Вы указали UTF-8, но исходный текст перед преобразованием в байтовый массив был представлен в другой кодировке. В какой? Я прошел по вашей ссылке http://meteonovosti.ru/index.php?index=8&value=26063, открыл в браузере консоль разработчика, там во вкладке Network можно увидеть различные http-заголовки, один из них был

Content-Type: text/html; charset=koi8-r

Значит ваш русский текст был представлен в кодировке koi8-r, следовательно строку вам нужно инициализировать так:

answer = new String(answer.getBytes(), "KOI8-R");

UPD.

Извиняюсь, поспешил, нужно указать кодировку для InputStream, а не для создаваемой строки.

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "KOI8-R"));

UPDUPD.

Картинка, как это выглядит в браузере. Обычно нужно нажать F12, у вас откроется похожее полуокно, затем в адресной строке переходите на нужную вам страницу и на вкладке Network будут все http-запросы, обычно основной запрос находится вверху. Мой скришнот из Firefox, в Хроме всё выглядит похоже.

READ ALSO
Проблема при установке JRE

Проблема при установке JRE

Вот что выдает при установке: JRE Error code:1618

201
Выход за пределы массива Java StringIndexOutOfBoundsException

Выход за пределы массива Java StringIndexOutOfBoundsException

Задача состоит в том, чтобы найти и напечатать подстроку наибольшей длины из одинаковых символовВыдает ошибку, не могу понять, почему происходит...

289
Исключения в @Async методах. Spring

Исключения в @Async методах. Spring

Есть контекст со слушателем

231
Передать переменную из JS (Phonegap 7) в Java (Android 4.4)

Передать переменную из JS (Phonegap 7) в Java (Android 4.4)

Как передать переменную из Phonegap 7 JS в Android Java? Я читал на SO анлгоязычные решения, но многие они либо старые, либо просто не подходят в моём случае

260