Конвертировать легко. Обнаружение является сложной частью. Вы можете попробовать mb_detect_encoding , но это очень шаткий метод, он буквально «угадывает» тип контента, и, как подчеркивает @troelskn в комментариях, в лучшем случае можно угадать «грубые» различия (это многобайтовая кодировка) ?) но не удается обнаружить нюансы схожих наборов символов.
Правильный путь будет ИМО:
- Интерпретация любых
content-type
метатегов на странице
- Интерпретация любых
content-type
заголовков, отправленных сервером
- Если это ничего не дает, попробуйте "прослушать" кодировку, используя mb_detect_encoding ()
- Если это ничего не дает, вернитесь к определенному значению по умолчанию (возможно, ISO-8859-1, возможно, UTF-8).
В отличие от изложенного в рекомендациях в ответе @ Gumbo, я лично считаю, что метатеги должны иметь приоритет над заголовками сервера, потому что я вполне уверен, что если присутствует метатег, это более надежный индикатор фактической кодировки страницы, чем настройки сервера, некоторые операторы сайта даже не знают, как изменить. Однако правильный способ, по-видимому, заключается в обработке заголовков типа содержимого с более высоким приоритетом.
Для первого, я думаю, вы можете использовать get_meta_tags () . Последнее, которое вы уже должны получить из curl, вам просто нужно разобрать его. Здесь - полный пример того, как систематически обрабатывать заголовки ответов, обслуживаемых cURL.
Преобразование будет тогда использовать iconv :
$new_content = iconv("incoming-charset", "utf-8", $content);