Yandex, loadHTML(), кодировка

Diomas

Новичок
Yandex, loadHTML(), кодировка

Проблема заключается в следующем, страница яндекса с результатами поиска обрабатывается при помощи DOMDocument (PHP 5.1.2).
Если выводить эту страницу на экран - все нормально,
но если повытаскивать из нее данные через DOMDocument, кириллица становится нечитаемой.

Подскажите, пожалуйста, каким образом это можно решить. Если конвертацией iconv, то из чего во что и на каком этапе:
т.е. конвертировать из __ в __ перед loadHTML() или конвертировать уже полученные данные из __ в __?

Указание кодировки в конструкторе DOMDocument почему-то никаким образом не влияют на результат.
Код:
<?php
$code = join('', file('yandsearch.htm'));
$doc = new DOMDocument("1.0", "windows-1251");
$doc->loadHTML($code);
$xpath = new DOMXPath($doc);
$query = "/html/head/title";
$title = $xpath->query($query)->item(0)->nodeValue;
$result = "<title>" . $title . "</title>";
echo $result;
?>
-~{}~ 28.02.06 01:24:

Испробованы следующие ваианты:

Код:
$code = join('', file('yandsearch.htm'));
$code = iconv('windows-1251', 'utf-8', $code);
$doc = new DOMDocument();
$doc->loadHTML($code);
$xpath = new DOMXPath($doc);
$query = "/html/head/title";
$title = $xpath->query($query)->item(0)->nodeValue;
$result = "<title>" . $title . "</title>";
echo $result;
выдает нечитаемые символы типа &#208;&#188;&#209;&#128;&#208;°&#208;

Код:
$code = join('', file('yandsearch.htm'));
$doc = new DOMDocument();
$doc->loadHTML($code);
$xpath = new DOMXPath($doc);
$query = "/html/head/title";
$title = $xpath->query($query)->item(0)->nodeValue;
$result = "<title>" . $title . "</title>";
$result = iconv('windows-1251', 'utf-8', $result);
echo $result;
выдает нечитаемые символы типа ìðГ_ìîð

Код:
$code = join('', file('yandsearch.htm'));
$doc = new DOMDocument();
$doc->loadHTML($code);
$xpath = new DOMXPath($doc);
$query = "/html/head/title";
$title = $xpath->query($query)->item(0)->nodeValue;
$result = "<title>" . $title . "</title>";
$result = iconv('utf-8', 'windows-1251', $result);
echo $result;
выдает все до первого символа кириллицы (т.е. открывающий тег)
 

slach

Новичок
запомни один раз и навсегда
ВНУТРЕНЕЕ ПРЕДСТАВЛЕНИЕ ДАННЫХ в DOM - utf-8

выдает нечитаемые символы типа &#208;&#188;&#209;?&#208;°&#208;
т.е. в каком виде ты засасываешь HTML пофигу
сгодится первый вариант когда указывается кодировка в консрукторе
после этого loadHTML при построении DOM дерева конвертит с помощью iconv в utf-8
после того как ты пытаешься прочитать nodeValue и т.п. ты получаешь данные уже в виде utf-8
 

Diomas

Новичок
Спасибо за ответ.

Только почему не помогает $result = iconv('utf-8', 'windows-1251', $result); если в DOM'е он в utf-8?

-~{}~ 28.02.06 18:47:

На выходе у DOM'а не utf-8, не windows-1251, не cp866 и не ISO. А что тогда?
 

440hz

php.ru
PHP:
<?
$code = join('', file('yandsearch.htm'));
$doc = new DOMDocument();
$doc->loadHTML($code);
$xpath = new DOMXPath($doc);
$query = "/html/head/title";
$title = $xpath->query($query)->item(0)->nodeValue;
$result = "<title>" . $title . "</title>";
$result = iconv('utf-8', 'windows-1251', $result);
echo $result;
?>
Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /usr/www/wwwroot/440hz.expi-web.ru/iii.php on line 7
 

Diomas

Новичок
Так как все-таки реализовать "html(windows-1251) > DOM > любая читаемая кодировка"?

-~{}~ 01.03.06 18:52:

Делает он так:
"Вася" в win-1251 > DOM > "Âà ñÿ"
т.е. по 2 байта на символ (по идее это и есть utf-8),
но последующее
$result = iconv('utf-8', 'windows-1251', $result);
говорит, что найден неправильный символ (Detected an illegal character in input string)

Если смотреть результат (без iconv) в браузере, выставив там кодировку Юникод (UTF-8), то получается "&#194;&#224;&#241;&#255;".

Т.е. DOM на выходе дает не UTF-8, а нечто, что тоже кодирует кириллицу 2-мя байтами.

-~{}~ 03.03.06 06:12:

Проблема решена.
Вместо $result = iconv('utf-8', 'windows-1251', $result);
я использовал $result = utf8_decode($result);
 
Сверху