Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Определение кодировки страницы сайта.
Чтение страницы сайта и преобразование в UTF-8 или в Windows-1251

При формированнии карт сайтов с помощью сервиса периодически сталкивался с проблемами некорректного указания кодировки страницы или неуказания кодовой страницы вообще. В настоящий момент у меня работает функция анализа кодовой страницы похожая на представленную ниже.

Представленный ниже пример читает страницу, преобразует её в UTF-8, загружает в DOM-объект, получает из него title и выводит его в кодировке windows-1251.

Страница для анализа:

Запрос:

<form method="get">
    <label>Страница для анализа: <input type="text" name="url"></label>
</form>

PHP анализ и обработка:

$url=@$_GET['url'];

echo "<br>Страница <b>".$url."</b><br>\n";

   $curl = curl_init($url);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
   curl_setopt($curl, CURLOPT_HEADER, 1);    // включать header в вывод
   curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);    // следовать любому "Location: " header
   curl_setopt($curl, CURLOPT_TIMEOUT, 20);    // максимальное время в секундах, для работы CURL-функций.
   $html = @curl_exec($curl);

   $header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
   curl_close($curl); // close cURL handler

   $headers = substr($html, 0, $header_size - 4)."\n";
   $body = substr($html, $header_size);

if (preg_match("|Content-Type: .*?charset=(.*)\n|imsU", $headers, $results))$ct0=trim($results[1]);
else $ct0=false;

if (preg_match_all('/(<meta\s*http-equiv=[\'\"]Content-Type[\'\"]\s*content=[\'\"][^;]*;\s*charset=([^\"\']*?)(?:"|\;|\')[^>]*>)/i',$body,$arr,PREG_PATTERN_ORDER)){
    $ct1=strtolower(trim($arr[2][0]));
    // не учитываю, что заголовки могут быть разными. Это в платной версии.
    if ($ct1=='utf-8')$ct1=false;
    $ct0=false; // meta не добавлять
}else $ct1=false;

if ($ct1){
    echo "<br>Преобразование ".$ct1." -> UTF-8";
    $body=@iconv($ct1,'utf-8//IGNORE',$body);
}

// добавляю в head Content-Type
if($ct0)$body=preg_replace('/<head[^>]*>/','<head>
<meta charset="utf-8">
',$body);

// читаю преобразованный заголовок страницы с помощью DOM
// в полном примере это сделано с помощью регулярного выражения
$doc = new DOMDocument();

@$doc->loadHTML($body);

if ( ($tags = @$doc->getElementsByTagName('title')) ) {
    $title = @$tags->item(0)->nodeValue;
    print "<br>Заголовок страницы: ".@iconv("UTF-8", "windows-1251//IGNORE", $title).'<br />';
}

Приведенный пример упрощен и не содержит обработку "трудных" случаев. Полный пример дополнительно:

  • понимает, когда кодовая страница в header указана одна, а в META другая
  • содержит обработку двойных мета с разными кодовыми страницами(и такое у меня попадалось)
  • "борется" с кривыми страницами
  • умеет читать страницы по https даже с "кривыми" и самоподписанными сертификатами

Представленный полный код будет корректно работать на 99% страниц/сайтов в рунете.

Всего за 250 рублей (~3$) Вы можете приобрести готовый скрипт получения кодовой страницы. Код скрипта реализован на PHP, полностью открытый и не использует никаких дополнительных библиотек.

Соглашение по использованию платной версии:

  • Вы можете использовать полученный код в любых своих разработках, вы не обязаны указывать ссылку на источник.
  • Вы НЕ имеете права перепродавать её, размещать в свободном или ограниченном доступе, а также публиковать в любом виде.
  • Все остальные права сохраняются за автором.

Регистрация Войти Войти через VK Войти через FB Войти через Google Войти через Яндекс

При нажатии кнопки Оплатить и загрузить, Вы подтверждаете согласие с условиями использования скрипта, описанными на этой странице.
Вы будете перенаправлены на страницу выбора способа оплаты, после оплаты 250 рублей (~3$) начнется загрузка файла.
Чтобы мы не потеряли Вашу оплату при потере соединения, укажите Ваш действующий
адрес электронной почты
Сомневаетесь? Вы всегда сможете задать вопросы и получить помощь.

Вас может заинтересовать:


.