Сохранять utf8 при загрузке HTML из файла - PullRequest
4 голосов
/ 01 декабря 2011

Что ж, очевидно, у PHP и его стандартных библиотек есть некоторые проблемы, и DOMDocument не является исключением.

Существуют обходные пути для utf8 символов при загрузке строки HTML - $dom->loadHTML().

Видимо, я не нашел способа сделать это при загрузке HTML из файла - $dom->loadHTMLFile(). Хотя он читает и устанавливает кодировку из тегов <meta />, проблема наносит ответный удар, если я не определил их. Например, при загрузке фрагмента HTML (часть шаблона, например, footer.html), а не полностью построенного документа HTML.

Итак, как мне сохранить символы utf8 при загрузке HTML из файла, в котором нет ключей <meta />, и определение этих параметров не поддерживается?

Обновление

footer.html (файл закодирован в UTF-8 без спецификации):

<div id="footer">
    <p>My sūpēr ōzōm ūtf8 štrīņģ</p>
</div>

index.php:

$dom = new DOMDocument;
$dom->loadHTMLFile('footer.html');
echo $dom->saveHTML(); // results in all familiar effed' up characters

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 01 декабря 2011

Попробуйте взломать, как этот:

$doc = new DOMDocument();
$doc->loadHTML('<?xml encoding="UTF-8">' . $html);
// dirty fix
foreach ($doc->childNodes as $item)
    if ($item->nodeType == XML_PI_NODE)
        $doc->removeChild($item); // remove hack
$doc->encoding = 'UTF-8'; // insert proper

Несколько других перечислено в комментариях пользователей здесь: http://php.net/manual/en/domdocument.loadhtml.php. Также важно, чтобы заголовок вашего документа включал метатег для указания кодировки FIRST непосредственно после тега.

5 голосов
/ 12 октября 2012

Я бы предложил использовать мой ответ здесь: https://stackoverflow.com/a/12846243/816753 и вместо добавления еще одного <head> обернуть весь фрагмент в

<html>
    <head><meta http-equiv='Content-type' content='text/html; charset=UTF-8' /></head>
    <body><!-- your content here --></body>
</html>`
4 голосов
/ 01 декабря 2011

Хотя я не уверен, как решить проблему с ->loadHTMLFile(), вы рассматривали возможность использования file_get_contents() для получения HTML, запустите mb_convert_encoding() для этой строки, а затем передайте это значение в ->loadHTML() * * 1005

Редактировать: Кроме того, когда вы инициализируете DOMDocument , вы даете ему аргумент $ encoding?

3 голосов
/ 01 декабря 2011

Ключ только для вашего браузера. После того, как страница полностью создана, ваш браузер должен правильно отобразить страницу, если в конце у нее есть мета.

Вы всегда можете попробовать использовать функцию utf8_decode (или закодировать, я никогда не уверен, lol), прежде чем выводить данные следующим образом:

echo utf8_decode($dom->saveHTML());
...