Почему DOMDocument в php не воспринимает русскую кодировку?

Пишу парсер по вакансиям и столкнулся с проблемой: не могу получить нормальное содержимое toster.ru - кодировка портится где-то в DOMDocument. Ниже функция (вместо $linktocontent url тостера).

function parse($linktocontent) {

	$Contents = file_get_contents($linktocontent);
	if (!$Contents) {
		$result['error'] = "Can't get file";
		return $result;
	}

	$Selector = ".//*[@id='tasks_list']/div[1]/div";
	$dom = new DOMDocument;
	libxml_use_internal_errors(true);
	$dom->loadHtml($Contents);
	$xpath = new DOMXPath($dom);
	libxml_use_internal_errors(false);
	$list = $xpath->query($Selector);
	$numitems = $list->length;

	for ($i=0; $i<$numitems; $i++) {
		$j = $i+1;

		$SelectArticle = ".//*[@id='tasks_list']/div[1]/div[".$j."]";
		$SelectLink = ".//*[@id='tasks_list']/div[1]/div[".$j."]/div[@class='title']/a";
	 	$SelectSDesc = ".//*[@id='tasks_list']/div[1]/div[".$j."]/div[@class='description']";

        $result[$i]['header']    = $xpath->query($SelectLink)->item(0)->nodeValue;
        $result[$i]['shortdesc'] = $xpath->query($SelectSDesc)->item(0)->nodeValue;
        $result[$i]['link']      = "http://freelansim.ru".$xpath->query($SelectLink)->item(0)->attributes->getNamedItem("href")->nodeValue;
	}
    return $result;
 }


И то, что на выходе получается:

[0]=> array(6) { ["header"]=> string(69) "ÐоÑабоÑаÑÑ PHP ÑкÑипÑ" ["shortdesc"]=> string(806) "ÐÑÑÑ php ÑкÑÐ¸Ð¿Ñ Ð¿Ð°ÑÑеÑа, ÑабоÑавÑий Ñанее Ñ ÑайÑом, но из за изменений дизайна, пеÑеÑÑавÑий ÑабоÑаÑÑ, необÑодимо иÑпÑавиÑÑ ÑкÑÐ¸Ð¿Ñ (либо напиÑаÑÑ Ð½Ð¾Ð²Ñй), Ñак, ÑÑÐ¾Ð±Ñ Ð²Ñе ÑабоÑало, плÑÑ Ð´Ð¾Ð¿Ð¸ÑаÑÑ Ð¿Ð°ÑÑ Ð½ÐµÑложнÑÑ ÑÑнкÑий (подÑобноÑÑи в лиÑкÑ)" ["link"]=> string(32) "http://freelansim.ru/tasks/49586" ["timestamp"]=> string(0) "" ["cost"]=> string(53) "5 000 ÑÑб./за пÑоекÑ" ["number"]=> string(5) "49586" }


На fl.ru с этой функцией проблем не возникает. Есть ли решение для этого случая? Сам вожусь уже полдня и ни чему не пришел
  • Вопрос задан
  • 5505 просмотров
Пригласить эксперта
Ответы на вопрос 5
@Atomov
Данная строка не решит проблемы :$doc = new DOMDocument('1.0' 'utf-8');

Решается двумя способами:
1. Указание в тексте, который парсится нужной кодировки, скажем
'< meta http-equiv="Content-Type" content="text/html; charset=utf-8" >'

2. Либо сконвертировать все символы документа в HTML-entities перед импортом
$source = mb_convert_encoding($source, 'HTML-ENTITIES', 'utf-8');
$dom->loadHTML($source);
Ответ написан
Tantacula
@Tantacula Автор вопроса
Решил проблему добавив символ BOM в начало скачанной страницы. На всякий случай - кодировка utf-8 в httpd и htaccess задана, посему проблема остается невыявленной.
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Насколько я помню, то по дефолту идет кодировка ISO.

Попробуйте так:

$doc = new DOMDocument('1.0' 'utf-8');
Ответ написан
@negus
Я решил вопрос конвертацией уже полученных данных через mb_convert_encoding($str, 'iso-8859-1', 'UTF-8');

$doc = new DOMDocument('1.0' 'utf-8'); - действительно не помогает (пробовал до того, как нашёл этот пост).

Но мой вариант скорее всего грузит скрипт, т.к. при больших объёмах перекодировать большие тексты всяко дольше, чем изначально загружать их в правильной кодировке.
Поэтому вопрос остаётся открытым. Может действительно добавлять BOM в начало документа. Надо попробовать.
Ответ написан
Комментировать
AlexanderTsymbal
@AlexanderTsymbal
tsymbal.su
Действительно, проблема решается добавлением в начало исходного html-кода BOM-метки.
$html = "<div>.........ваш html-код.............</div>";
$BOM = "\xEF\xBB\xBF"; // UTF-8 BOM
$html = $BOM.$html;

$dom = new DOMDocument();
...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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