一尘不染

php:每当我尝试编写UTF-8时都使用DomDocument,它会以十六进制表示

php

当我尝试使用DomDocument将UTF-8字符串写入XML文件时,实际上是写入字符串的十六进制表示法,而不是字符串本身。

例如:

ירושלים

代替:ירושלים

任何想法如何解决问题?


阅读 237

收藏
2020-05-29

共1个答案

一尘不染

好了,你去:

$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加载到未指定编码的Document中,您将丢失在构造函数中声明的所有内容,这意味着:

$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();

它将按预期工作。

或者,您也可以在加载文档后指定编码

2020-05-29