Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как указать кодировку для парсинга?
Перепробовал много чего, но вопросики так и не смог превратить в нормальный текст.
Докопался до того, что в header`e сайтов (в заголовках которые отдает сервер нет указания кодировки), с которых вместо текста парсятся вопросы нет указания кодировки.
Как я понимаю, curlу надо указать кодировку. А у этих проблемных сайтов кодировка указана в html коде - в метатегах. Но это для curlа уже бесполезно - он спарсил текст в виде вопросов. Подскажите как решить проблемку.
Я программист-любитель. Прошу не пинать сильно.
Мелкий
Отправлено: 28 Мая, 2016 - 17:03:49
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
curl вообще бинарный. Ему на кодировки фиолетово. Его дело - транспорт, бинарно-безопасный транспорт.
Сами ручками из заголовков достаёте Content-Type, парсите, получаете кодировку. Если нет заголовка, парсите и читаете мета-теги, если и там нет (или ещё веселее, есть и там и там, но разные, а сам документ - вовсе в третьей) - пытаетесь угадать по контенту.
Или берёте что-нибудь более сложное и удобное, чем пинать голый транспортный курл.
----- PostgreSQL DBA
Странник
Отправлено: 28 Мая, 2016 - 17:42:27
Новичок
Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010
Помог: 0 раз(а)
Мелкий пишет:
Сами ручками из заголовков достаёте Content-Type, парсите, получаете кодировку. Если нет заголовка, парсите и читаете мета-теги, если и там нет (или ещё веселее, есть и там и там, но разные, а сам документ - вовсе в третьей) - пытаетесь угадать по контенту.
Делал так, принудительно указывал кодировку, но видимо она не соответствовала реальности т.к. вопросы оставались.
Мелкий пишет:
...пытаетесь угадать по контенту.
Как? Подскажите.
Мелкий пишет:
Или берёте что-нибудь более сложное и удобное, чем пинать голый транспортный курл.
Раз спрашиваю, значит не знаю. Зачем умничать. Может лучше подсказать?
Мелкий
Отправлено: 28 Мая, 2016 - 19:17:28
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Странник пишет:
Раз спрашиваю, значит не знаю
Дык это и есть предложение искать куда-нибудь в эту сторону. Я не в курсе, что сейчас есть живое.
Например, есть тяжёлая артиллерия в виде phantomjs, уж если headless chromium не прочитает, то у рядовых юзеров точно проблемы будут. Возможно, для вашей задачи это слишком тяжёлая штука, а может и в самый раз будет.
Странник пишет:
Как? Подскажите.
Например, лезете в справочники, смотрите среднее частотное распределение символов кириллического алфавита в тексте. Затем пытаетесь подобрать кодировку, чтобы, образно, символ "а" встречался гораздо чаще "б". Байты в неверной кодировке обычно не встречаются вовсе.
Ну или что-нибудь ещё интересное по запросу "определение кодировки текста".
----- PostgreSQL DBA
Странник
Отправлено: 28 Мая, 2016 - 19:58:57
Новичок
Покинул форум
Сообщений всего: 10
Дата рег-ции: Апр. 2010
Помог: 0 раз(а)
Для себя вопрос решил так:
Забираю контент в чистом виде по урлу примерно так:
$page = @file_get_contents($request);
Т.к. я работаю с utf-8 я затем зная что весь контент со всех сайтов уже в кодировке ср1251, конвертирую в utf-8:
if($codir != 'UTF-8'){ $content = iconv("cp1251","utf-8",$content); }
Теперь весь контент единообразно и корректно отображается, и весь в utf-8.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.