PHP поддерживает работу с классом DOMDocument, но есть некоторые особенности, которые требуют внимания. Одна из них — это html кодирование символов, если вы не укажете в заголовке документа мета информацию о кодировке.
Рассмотрим пример:
1 2 3 4 5 |
<?php $doc = new DomDocument('1.0', 'UTF-8'); $file = @$doc->loadHTML('Это мой <i>документ</i> в HTML'); echo @$doc->saveHTML(); ?> |
В зависимости от того, в какой кодировке был ваш текст, получится разный результат. Вот пример, когда ваш текст был в win-1251:
1 2 3 |
<span class="html-tag"><p></span>Ýòî ìîé <span class="html-tag"><i></span>äîêó ìåíò<span class="html-tag"></i></span> â HTML<span class="html-tag"></p></span> |
А вот пример для исходного текста в UTF-8:
1 2 3 |
<span class="html-tag"><p></span>Это мо й <span class="html-tag"><i></span>доку мент<span class="html-tag"></i></span> в HTML<span class="html-tag"></p></span> |
Видно, что кириллические символы представлены в виде 16ти-ричных HTML кодов.
Почему вывелась не исходная кириллица, а была произведена перекодировка? Произошло это от того, что программа не знает, какая кодировка должна быть у документа — она ведь не указана. Для функции saveHTML() её нужно указать в секции документа head, как meta-тэг:
1 2 3 4 5 6 7 |
<?php $doc = new DomDocument('1.0', 'UTF-8'); $file = @$doc->loadHTML('<head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head>' . 'Это мой <i>документ</i> в HTML'); echo @$doc->saveHTML(); ?> |
Если указанная кодировка в meta совпадает с кодировкой текста, то вы получите на выходе:
1 2 3 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head> <body><p>Это мой <i>документ</i> в HTML</p></body></html> |