php: используя DomDocument всякий раз, когда я пытаюсь написать UTF-8, он записывает его шестнадцатеричное представление

Когда я пытаюсь записать строки UTF-8 в файл XML с использованием DomDocument, он фактически записывает шестнадцатеричное представление строки вместо самой строки.

например:

ירושלים

вместо: ירושלים

есть идеи, как решить проблему?

11
задан JakeGould 28 May 2019 в 16:43
поделиться

3 ответа

Хорошо, давайте:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->appendChild($dom->createElement('root'));
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

будет работать нормально, потому что в этом случае созданный вами документ сохранит кодировку, указанную в качестве второго аргумента:

<?xml version="1.0" encoding="utf-8"?>
<root>ירושלים</root>

Однако, как только вы загрузите XML в документ, который не указать кодировку, вы потеряете все, что вы объявили в конструкторе, что означает:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadXml('<root/>'); // missing prolog
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

не будет кодировки utf-8:

<?xml version="1.0"?>
<root>&#x5D9;&#x5E8;&#x5D5;&#x5E9;&#x5DC;&#x5D9;&#x5DD;</root>

Поэтому, если вы что-то загружаете в XML, убедитесь, что это

$dom = new DOMDocument();
$dom->loadXml('<?xml version="1.0" encoding="utf-8"?><root/>');
$dom->documentElement->appendChild(new DOMText('ירושלים'));
echo $dom->saveXml();

и это будет работать как и ожидалось.

В качестве альтернативы вы также можете указать кодировку после загрузки документа.

17
ответ дан 3 December 2019 в 03:34
поделиться

По-видимому, передача documentElement как $node для saveXML помогает обойти это, хотя я не могу сказать, что понимаю, почему.

напр.

$dom->saveXML($dom->documentElement);

а не:

$dom->saveXML();

Источник: http://www.php.net/manual/en/domdocument.savexml.php#88525

3
ответ дан 3 December 2019 в 03:34
поделиться

Когда я создавал DomDocument для записи, я добавил следующие параметры:

dom = new DOMDocument('1.0','utf-8');

эти параметры заставляли строку UTF-8 записываться как есть.

0
ответ дан 3 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

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