php проблема с русским языком

я получаю страницу в utf-8 с русским языком, используя curl. если я повторяю текст, он показывает хорошо. тогда я использую такой код

$dom = new domDocument; 

        /*** load the html into the object ***/ 
        @$dom->loadHTML($html); 

        /*** discard white space ***/ 
        $dom->preserveWhiteSpace = false; 

        /*** the table by its tag name ***/ 
        $tables = $dom->getElementsByTagName('table'); 

        /*** get all rows from the table ***/ 
        $rows = $tables->item(0)->getElementsByTagName('tr'); 

        /*** loop over the table rows ***/ 
        for ($i = 0; $i <= 5; $i++)
        { 
            /*** get each column by tag name ***/ 
            $cols = $rows->item($i)->getElementsByTagName('td'); 

            echo $cols->item(2)->nodeValue; 

            echo '<hr />'; 
        } 

$html содержит русский текст. после строки echo $cols->item(2)->nodeValue; выводить текст ошибки, а не русский. я пытаюсь iconv, но не работает. Любые идеи?


person kusanagi    schedule 06.10.2010    source источник
comment
Я не понимаю, в чем твой вопрос. Какой текст ошибки вы получаете? Что значит не работает?   -  person Pekka    schedule 06.10.2010
comment
вместо русского я получаю Ð ÑоÑо?   -  person kusanagi    schedule 06.10.2010


Ответы (3)


Я предлагаю использовать mb_convert_encoding перед загрузкой страницы UTF-8.

    $dom = new DomDocument();   
    $html = mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");
    @$dom->loadHTML($html);

ИЛИ еще вы могли бы попробовать это

    $dom = new DomDocument('1.0', 'UTF-8');
    @$dom->loadHTML($html);
    $dom->preserveWhiteSpace = false;
    ..........
    echo html_entity_decode($cols->item(2)->nodeValue,ENT_QUOTES,"UTF-8");
    .......... 
person Asif Mulla    schedule 06.10.2010
comment
Насколько я понимаю, loadHTML поддерживает только ISO-88591. Вот почему вы должны кодировать все символы utf-8 в их объекты (которые на самом деле являются объектами utf-16). Если вы хотите избежать преобразования, вы можете использовать loadXML, который поддерживает utf-8, однако loadXML очень строг к неработающим элементам, плюс вам нужно исправить множество строк для незакрывающих элементов, таких как ‹br› - person Joseph Montanez; 12.07.2011

DOM не может распознать кодировку HTML. Вы можете попробовать что-то вроде:

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);

// taken from http://php.net/manual/en/domdocument.loadhtml.php#95251
person bisko    schedule 06.10.2010
comment
Это то, что он делает. HTML — это в основном XML-документ с заданным определением. Вы всегда можете просто попробовать и посмотреть, работает ли это. - person bisko; 06.10.2010

mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8");

То же самое работало для PHPQuery.

P.S. Я использую phpQuery::newDocument($html);

вместо $dom->loadHTML($html);

person cofirazak    schedule 09.04.2014