Неверное определение кодировки mb_detect_encoding
Необходимо выбрать содержимое тега title. Обрабатываю с помощью DOM парсера. Когда сохраняю у себя и открываю в редакторе содержимое тега title отображается нормально - кириллица. На php-странице и при сохранении в БД выглядит так - ÐаÑалог книг онлайн â ÑиÑайÑе онлайн и ÑкаÑивайÑе беÑплаÑно ÑедевÑÑ ÑÑÑÑкой клаÑÑиÑеÑкой лиÑеÑаÑÑÑÑ.
Получаю содержимое страницы. Определяю кодировку функцией mb_detect_encoding - выводит "UTF-8". Однако декодер студии Лебедева (https://www.artlebedev.ru/decoder/advanced/) определяет ее как ISO-8859-1.
Перекодирую из ISO-8859-1 в UTF-8 - получаю еще один вид "крокозябов" - ÃÂðÃÂðûþó úýøó þýûðùý â ÃÂøÃÂðùÃÂõ þýûðùý ø ÃÂúðÃÂøòðùÃÂõ ñõÃÂÿûðÃÂýþ ÃÂõôõòÃÂàÃÂÃÂÃÂÃÂúþù úûðÃÂÃÂøÃÂõÃÂúþù ûøÃÂõÃÂðÃÂÃÂÃÂÃÂ.
Вот код обработки:
$dom = new DOMDocument;
@$dom->loadHTML(file_get_contents('https://www.culture.ru/literature'));
$tlt = $dom->getElementsByTagName("title");
foreach ($tlt as $element)
{
$title = $element->nodeValue;
// Исходный текст
echo "Исходный текст: ".$title.'<br>';
// Определение кодировки - UTF-8
echo "Кодировка: ".mb_detect_encoding($title).'<br>';
// Перекодируем в utf-8
echo "Название: ".iconv("ISO-8859-1", "UTF-8", $title).'<br>';
}
Вопроса 2:
Почему функция PHP возвращает одну кодировку, а скрипт Лебедева - другую (причем нормально форматирует в кириллицу)?
Как мне в данном случае преобразовать этот текст к кириллице?
Ответы (2 шт):
В этой функции нет какой-то магии, которая позволит для заданного куска бинарника угадать кодировку текста. Ключевое слово "угадать". Что такое кодировка? Таблица соответствия байт и отображаемых символов. Если у вас есть только бинарная строка байт - этого недостаточно чтобы узнать как это отображать. Для большинства кодировок мира определено значение для любого возможного байта (собственно потому столь много кодировок некогда и появилось, что многобайтовые кодировки было дорого, а однобайтовые - мало). Если для всех байтов есть значения - то и отобразить можем в любой из этих кодировок. Можно только попробовать угадать что из этого пользователь сочтёт имеющим смысл.
Необходимо выбрать содержимое тега title
Ищите кодировку в HTTP-ответе сервера и в meta-тегах. Хотя особое счастье если они различаются... Сейчас с этим заметно проще чем 15-20 лет назад, можно рассчитывать что в HTTP заголовках кодировка указана и указана корректно.
echo "Название:" . mb_convert_encoding($title, 'ISO-8859-1', 'auto') . "</br>";
// или
echo "Название: " . utf8_decode($title) . "</br>";
mb_convert_encoding — Преобразует кодировку символов
What is the difference between iconv() and mb_convert_encoding() in PHP?
