Как преобразовать веб-контент в постоянный набор символов при сканировании в Интернете? - PullRequest
4 голосов
/ 23 ноября 2011

Я провел много исследований по этому вопросу и провел множество испытаний.

Насколько я понимаю, заголовки HTTP устанавливаются только в том случае, если для этого настроен веб-сервер, и могут по умолчанию использоватьконкретная кодировка, даже если разработчики не намеревались этого.Мета-заголовки устанавливаются только в том случае, если разработчик решил сделать это в своем коде ... это также может быть установлено автоматически некоторыми средами разработки (что проблематично, если разработчик не учел это).

I 'мы обнаружили, что если они установлены вообще, они часто конфликтуют друг с другом.например.заголовок HTTP говорит, что страница iso-8859-1, а метатег указывает windows-1252.Я мог бы предположить, что одно заменяет другое (вероятно, метатег), но это кажется довольно ненадежным.Также кажется, что очень немногие разработчики учитывают это при работе со своими данными, поэтому динамически генерируемые сайты часто смешивают кодировки или используют кодировки, которые они не собираются использовать через разные кодировки, поступающие из их базы данных.

Мой вывод заключается в следующем:

  1. Проверьте кодировку каждой страницы, используя mb_detect_encoding().
  2. Если это не удастся, я использую мета-кодирование (http-equiv="Content-Type"...).
  3. Если мета-тип содержимого отсутствует, я использую заголовки HTTP (content_type).
  4. Если нет http-типа содержимого, я предполагаю UTF-8.
  5. Наконец, я конвертирую документ, используя mb_convert_encoding ().Тогда я очищаю это для содержания.(Я специально исключил кодировку для преобразования, чтобы избежать этого обсуждения.)

Я пытаюсь получить как можно больше точного контента, а не просто игнорировать веб-страницы, потому что разработчикинеправильно установил свои заголовки.

Какие проблемы вы видите при таком подходе?

Собираюсь ли я столкнуться с проблемами с помощью mb_detect_encoding ()и методы mb_convert_encoding ()?

1 Ответ

1 голос
/ 23 ноября 2011

Да, вы столкнетесь с проблемами. mb_detect_encoding не совсем надежен, см. Эти примеры:

Это выводит bool(false), указывая, что обнаружение не удалось:

var_dump(mb_detect_encoding(file_get_contents('http://www.pazaruvaj.com/')));

Этот другой выводит string(5) "UTF-8", что, очевидно, неверный результат. Заголовки HTTP и http-equiv правильно установлены на этом веб-сайте, и это недопустимо в формате UTF-8:

var_dump(mb_detect_encoding(file_get_contents('http://www.arukereso.hu/')));

Я предлагаю вам применить все доступные методы, а также использовать внешние библиотеки (например, такую: http://mikolajj.republika.pl/) и использовать наиболее вероятную кодировку.

Другой подход, позволяющий сделать его более точным, состоит в том, чтобы создать список возможных наборов символов для конкретной страны и использовать только те, которые имеют mb_convert_encoding. Как и в Венгрии, ISO-8859-2 или UTF-8 наиболее вероятны, другие не заслуживают рассмотрения. Страну можно угадать по комбинации TLD, заголовка Content-Language HTTP и местоположения IP-адреса. Хотя это требует определенных исследований и дополнительных разработок, оно может стоить усилий.

В некоторых комментариях к документации mb_convert_encoding сообщается, что iconv лучше работает для японских наборов символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...