За последние 24 часа нас посетили 19425 программистов и 1604 робота. Сейчас ищут 975 программистов ...

Проблемы с кодировкой при использовании DOM и SimpleXML

Тема в разделе "Прочие вопросы по PHP", создана пользователем Lobankovanastia, 7 июн 2009.

  1. Lobankovanastia

    Lobankovanastia Активный пользователь

    С нами с:
    7 июн 2009
    Сообщения:
    3
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Добрый день. Маюсь несколько дней, не могу найти решение. Есть htm файл (http://darovanie.com/contact.htm), в нем указана кодировка '<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />'. Необходимо получить ноду с id='text' (содержимое ноды и сам тэг с атрибутами) средствами php. Использую DOM и SimpleXml. В результате часть ноды имеет неверную кодировку.

    Создаю DOM Document:

    $doc = new DOMDocument();
    $doc->loadHTMLFile(<имя файла>);

    Получаю ноду с id='text' :

    $textnode = $doc->getElementById('text');

    Получаю содержимое ноды:

    $s = simplexml_import_dom($textnode);
    $utf = $s->asXML();
    (
    при выводе print_r($utf) и установке в браузере вручную кодировки UTF-8 видим в первых 3 строках ноды символы подобно 'Àäðåñ' , далее нормально русские буквы
    )

    Конвертирую содержимое из кодировки UTF-8 в WINDOWS-1251:

    $text = iconv("UTF-8","WINDOWS-1251//IGNORE",$utf);

    В результате в первых 3 строках ноды(это таблица) не отображаются русские буквы. Дальше все нормально по-русски.

    Структура файла не указывает на ошибку.

    Отчего так?

    спасибо всем, кто откликнется.
     
  2. Lobankovanastia

    Lobankovanastia Активный пользователь

    С нами с:
    7 июн 2009
    Сообщения:
    3
    Симпатии:
    0
    Адрес:
    Екатеринбург
  3. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    Попробуйте перенести meta content-type выше, чем начинаются русские буквы - в данном случае выше title.
     
  4. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Lobankovanastia
    тоже проблема с кодировками. Если загружаю страницу в win-1251.

    Делал и так $html = iconv(«windows-1251», «utf-8», $html); и даже так $dom = new DOMDocument('1.0', 'windows-1251'); — ничего не получается, выдает иероглифы

    Расскажите как решили?
     
  5. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    Помогите, никак не могу разобраться с кодировками в DOM. Кириллица выводится иероглифами :(

    PHP Version 5.2.9-2
    Build Date Apr 9 2009 08:22:37
    DOM/XML API Version 20031129
    libxml Version 2.7.3
     
  6. Ruzzz

    Ruzzz Активный пользователь

    С нами с:
    11 фев 2008
    Сообщения:
    148
    Симпатии:
    1
    вот решение:
    Функция подготовки html-кода для работы с DOM — решает проблемы с кириллицей!
    PHP:
    1. <?php
    2. function prepareForDOM($html, $encoding) {
    3.     $html = iconv($encoding, 'UTF-8//TRANSLIT', $html);
    4.     $html = preg_replace('/<(script|style|noscript)\b[^>]*>.*?<\/\1\b[^>]*>/is', '', $html);
    5.     $tidy = new tidy;
    6.     $config = array(
    7.         'drop-font-tags' => true,
    8.         'drop-proprietary-attributes' => true,
    9.         'hide-comments' => true,
    10.         'indent' => true,
    11.         'logical-emphasis' => true,
    12.         'numeric-entities' => true,
    13.         'output-xhtml' => true,
    14.         'wrap' => 0
    15.     );
    16.     $tidy->parseString($html, $config, 'utf8');
    17.     $tidy->cleanRepair();
    18.     $html = $tidy->value;
    19.     $html = preg_replace('#<meta[^>]+>#isu', '', $html);
    20.     $html = preg_replace('#<head\b[^>]*>#isu', "<head>\r\n<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />", $html);
    21.     return $html;
    22. };
    23.  
    24. $html = file_get_contents($url);
    25. $html = prepareForDOM($html, 'windows-1251');
    26.  
    27. $dom = new DOMDocument();
    28. @$dom->loadHTML($html);
    29.  
    30. // Ну и начинаем работать с DOM
    31. $nodes = $dom->getElementsByTagName('img');
    32. ?>
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    А если установить локаль в UTF-8 ?
    У меня похожие проблемы были с fgetcsv() - пока локаль не установил - всё шло вкривь и вкось.
     
  8. Lobankovanastia

    Lobankovanastia Активный пользователь

    С нами с:
    7 июн 2009
    Сообщения:
    3
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Black Raven
    спасибо. ты гений!!! хз как, но это помогло!!!! работает!!! я в восторге. счастье бесконечно.