DomDocument ломается кодировка

schweppes

Новичок
DomDocument ломается кодировка

Здравствуйте!
При загрузке файла в DomDocument ломается кодировка. Изначально файл написан в cp1251, читал, что DomDocument подразумевает, что xml файл должен быть в utf-8 (или в utf-16, т.к. положено по стандарту). Для этого пытаюсь перекодировать исходный файл. Вот код:
PHP:
 error_reporting(E_ALL ^ E_WARNING);
 
 $fp = fopen("html/drive/drive.ru.html","r");
 $contents = fread($fp,filesize("html/drive/drive.ru.html"));
 fclose($fp);
 $contents = mb_convert_encoding($contents,'UTF-8','WINDOWS-1251');
 $fp = fopen("html/drive/drive.ru2.html","w+");
 fwrite($fp,$contents);
 fclose($fp);
 
 $dom = new DomDocument();
 $dom->loadHTMLFile("html/drive/drive.ru2.html");

 echoDomDocument($dom);

 function echoDomDocument($node) {
    foreach($node->childNodes as $childNode) {
    	if($childNode->hasChildNodes())
            echoDomDocument($childNode);
        elseif($childNode->nodeType == XML_TEXT_NODE && strlen(trim($childNode->textContent)) > 0)
            print($childNode->textContent)."<br/>";
    }   
 }
Но ноды все равно выводятся в кривой кодировке. Без начальной перекодировки тоже самое. Если пытаться перекодировать текст ноды и слать соответствующий content-type браузеру тоже не помогает (причем каждый раз разные кракозяблы, я не могу определить, что за кодировка получается). В Html DTD указан 4.01 strict, но сам документ не является well-formed, если это все имеет значение.
Заранее спасибо.
 

dimagolov

Новичок
schweppes, если верить доке, то DomDocument всегда подразумевает UTF8. А что у тебя получается в файле "html/drive/drive.ru2.html" ты смотрел?
 

schweppes

Новичок
dimagolov
Я вообще-то написал об этом в начале своего сообщения и акцентировал внимание, что перекодирую сначала в UTF-8, вот моя цитата:
Изначально файл написан в cp1251, читал, что DomDocument подразумевает, что xml файл должен быть в utf-8 (или в utf-16, т.к. положено по стандарту). Для этого пытаюсь перекодировать исходный файл.
Если открыть перекодированный файл html/drive/drive.ru2.html notepad++, то он говорит, что 'ANSI as UTF-8'
 

schweppes

Новичок
StUV
PHP:
 $fp = fopen("html/drive/drive.ru.html","r");
 $contents = fread($fp,filesize("html/drive/drive.ru.html"));
 fclose($fp);
 header("Content-Type: text/html; charset=windows-1251");
 echo htmlspecialchars($contents);
 $contents = mb_convert_encoding($contents,'UTF-8','WINDOWS-1251');
 $fp = fopen("html/drive/drive.ru2.html","w+");
 fwrite($fp,$contents);
 fclose($fp);
 echo "<br/><br/>".htmlspecialchars($contents);
Первое да, второе, естественно, нет. Сейчас попробую обновиться до 5.2.3, может баг, сейчас 5.2.1
 

maxru

МИФИст
schweppes я тоже, когда делал обработку xsl-шаблонов мучался - грузил шаблон в utf-8, сгенерированный xml конвертил в utf-8 и на выходе все равно получались кракозябры.
В итоге сделал шаблон в windows-1251 и в шаблоне и в xml прописал
<?xml version="1.0" encoding="windows-1251"?>
И все стало ОК.
 

schweppes

Новичок
maxru
Да, но у меня не xml , даже не xhtml, а просто html и meta тег не помогает (хотя где-то встречал, что DomDocument определяет кодировку при loadHTML() как раз из мета тега, буду еще пробовать) Но мне надо сделать нечто универсальное для многих сайтов, а не дописывать индивидуально к каждому сайту свои костыли, кстати, и обновление до 5.2.3 не помогло
 

maxru

МИФИст
Автор оригинала: schweppes
maxru
Да, но у меня не xml , даже не xhtml, а просто html и meta тег не помогает (хотя где-то встречал, что DomDocument определяет кодировку при loadHTML() как раз из мета тега, буду еще пробовать) Но мне надо сделать нечто универсальное для многих сайтов, а не дописывать индивидуально к каждому сайту свои костыли, кстати, и обновление до 5.2.3 не помогло
Надо не "где-то встречать", а читать официальный мануал.
DomDocument::__construct()
 

schweppes

Новичок
maxru
Читал и передавал в конструктор я кодировку (причем до того как написал сюда), только и это не помогает.
 
Сверху