Почему nokogiri возвращает текст не с той кодировкой ?

Отдаю в библиотеку кусок html - кода (кодировка UTF-8). На выходе в индексе #text получаю что - то подобное: СÑÑоиÑелÑÑÑво. С чем может быть связана проблема?
  • Вопрос задан
  • 2693 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Vantuz
Вся проблема в том что иногда не удается получить кодировку из DOM

можно попробовать сделать так
include 'nokogiri.php';

$html = file_get_contents('http://....');
$saw = nokogiri::fromHtmlNoCharset($html);
Ответ написан
Комментировать
@ray_qwer
Пользовался nokogiri.
Попадались страницы со странными кодировками. Прогонял текст через такую функцию:

//проверяет в какой кодировке текст и возвращает utf-8
    public static function getUTF8($text) {

        $UTF32_BIG_ENDIAN_BOM = chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF);
        $UTF32_LITTLE_ENDIAN_BOM = chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00);
        $UTF16_BIG_ENDIAN_BOM = chr(0xFE) . chr(0xFF);
        $UTF16_LITTLE_ENDIAN_BOM = chr(0xFF) . chr(0xFE);
        $UTF8_BOM = chr(0xEF) . chr(0xBB) . chr(0xBF);

        $first2 = substr($text, 0, 2);
        $first3 = substr($text, 0, 3);
        $first4 = substr($text, 0, 3);

        $encoding = null;
        if ($first3 == $UTF8_BOM) $encoding = 'UTF-8';
        else if ($first4 == $UTF32_BIG_ENDIAN_BOM) $encoding = 'UTF-32BE';
        else if ($first4 == $UTF32_LITTLE_ENDIAN_BOM) $encoding = 'UTF-32LE';
        else if ($first2 == $UTF16_BIG_ENDIAN_BOM) $encoding = 'UTF-16BE';
        else if ($first2 == $UTF16_LITTLE_ENDIAN_BOM) $encoding = 'UTF-16LE';

        if($encoding)
            return mb_convert_encoding($text, 'UTF-8', $encoding);

        return $text;
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы