Как получить нелатинские символы с сайта? - PullRequest
2 голосов
/ 27 февраля 2011

Я пытаюсь получить данные из latata.pl/pl.php и просмотреть все признаки (польский - iso-8859-2)

 final URL url = new URL("http://latata.pl/pl.php");
    final URLConnection urlConnection = url.openConnection();
    final BufferedReader in = new BufferedReader(new InputStreamReader(
            urlConnection.getInputStream()));
    String inputLine;

    while ((inputLine = in.readLine()) != null) {
        System.out.println(inputLine);
    }
    in.close();

Не работает.:( Есть идеи?

Ответы [ 5 ]

3 голосов
/ 27 февраля 2011

Ваш InputStreamReader будет пытаться преобразовать байты, возвращающиеся через TCP-соединение, используя кодировку по умолчанию для вашей платформы (которая, скорее всего, является UTF-8 или одной из ужасных Windows). Вы должны явно указать кодировку.

Если веб-сервер работает хорошо, вы можете найти правильную кодировку в одном из заголовков HTTP (я забыл, какой). Или вы можете просто предположить, что это iso-8859-2, но это может сломаться позже.

3 голосов
/ 27 февраля 2011

Средство чтения InputStream имеет несколько конструкторов , и вы можете (должны / должны) указывать кодировку в таком случае в одном из этих конструкторов.

2 голосов
/ 27 февраля 2011

Как уже было сказано, кодировка кодировки для ответа не указана. Принудительное отображение документа ответа как ISO-8859-2 (обычно используется в центральной Европе) приводит к отображению допустимых символов польского языка, поэтому я предполагаю, что это фактически используемая кодировка. Поскольку кодировка не указана, будет использоваться стандарт ISO-8859-1, так как это значение по умолчанию.

Заголовки ответа должны включать заголовок Content-Type: text / html; charset = ISO-8859-2 для кодовых точек символов, которые должны быть правильно интерпретированы. Эта кодировка будет использоваться при построении ответа InputStream.

2 голосов
/ 27 февраля 2011

Вывод вашего php-скрипта pl.php неверен. Существует HTTP-заголовок Content-Type: text/html, установленный без объявленной кодировки. Без объявленной кодировки клиент должен предположить, что это ISO-8859-1 относительно HTTP-спецификаций. Отправленное тело - ±ê³ó¿¡Ê£¯¬, если интерпретируется как ISO-8859-1.

Байты, отправленные php-скриптом, представляют ąęłóżĄĘŁŻŹ, если он был объявлен как

Content-Type: text/html; charset=ISO-8859-2

Вы можете проверить это с помощью простого фрагмента кода, который преобразует ошибочную кодировку ISO-8859-1 в ISO-8859-2:

final String test="±ê³ó¿¡Ê£¯¬";
String corrupt=new String(test.getBytes("ISO-8859-1"),"ISO-8859-2");
System.out.println(corrupt);    

Вывод будет ąęłóżĄĘŁŻŹ, что является некоторыми польскими символами.

В качестве быстрого исправления установите кодировку в вашем php-скрипте так, чтобы выводить Content-Type: text/html; charset=ISO-8859-2 как HTTP-заголовок.

Но вам все равно стоит подумать о переключении на кодированный выход UTF-8.

2 голосов
/ 27 февраля 2011

Это слишком долго для комментария, но кто установил эту веб-страницу? Вы? Из того, что я вижу, это выглядит неправильно.

Вот что вы получите обратно:

$ telnet latata.pl 80
Trying 91.205.74.65...
Connected to latata.pl.
Escape character is '^]'.
GET /pl.php HTTP/1.0
Host: latata.pl

HTTP/1.1 200 OK
Date: Sun, 27 Feb 2011 13:49:19 GMT
Server: Apache/2
X-Powered-By: PHP/5.2.16
Vary: Accept-Encoding,User-Agent
Content-Length: 10
Connection: close
Content-Type: text/html

����ʣ��Connection closed by foreign host.

HTML просто:

<html>
<head></head>
<body>±ê³ó¿¡Ê£¯¬</body>
</html>

И вот так ваша страница выглядит из браузера. Есть ли веская причина, по которой на этой HTML-странице не указана кодировка ?

...