PHP DOMDocument :: save()保存为ASCII而不是UTF-8

时间:2015-12-30 02:59:01

标签: php xml utf-8 domdocument

我正在使用DOMDocumentSimpleXMLElement来创建格式化的XML文件。虽然这一切都有效,但生成的文件保存为ASCII,而不是UTF-8。我无法找到关于如何改变它的答案。

XML的创建如下:

    $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9";
    $rootNode = new \SimpleXMLElement("<?xml version='1.0' encoding='UTF-8'?><urlset></urlset>");
    $rootNode->addAttribute('xmlns', $XMLNS);

    $url = $rootNode->addChild('url');
    $url->addChild('loc', "Somewhere over the rainbow");

    //Turn it into an indented file needs a DOMDocument...
    $dom = dom_import_simplexml($rootNode)->ownerDocument;
    $dom->formatOutput = true;

    $path = "C:\\temp";

    // This saves an ASCII file
    $dom->save($path.'/sitemap.xml');

生成的XML看起来像这样(我认为应该如此):

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>Somewhere over the rainbow</loc>
  </url>
</urlset>

不幸的是,该文件是ASCII编码的,而不是UTF-8。

我该如何解决这个问题?

编辑:不要使用记事本++来检查编码

由于下面接受的答案,我现在已经开始工作了。有一个注意事项:我使用Notepad ++打开文件并检查编码。但是,当我重新生成文件时,Notepad ++会更新其选项卡,并出于某种原因将ANSI指示为编码。然后在Notepad ++中关闭并重新打开相同的文件将再次表示UTF-8。这让我感到困惑。

2 个答案:

答案 0 :(得分:2)

我认为这里有很多事情要发生。首先,你需要:

$dom->encoding = 'utf-8';

但是,我认为我们应该尝试创建DOMDocument手动指定正确的编码。所以:

<?php

$XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9";
$rootNode = new \SimpleXMLElement("<?xml version='1.0' encoding='UTF-8'?><urlset></urlset>");
$rootNode->addAttribute('xmlns', $XMLNS);

$url = $rootNode->addChild('url');
$url->addChild('loc', "Somewhere over the rainbow");

// Turn it into an indented file needs a DOMDocument...
$domSxe = dom_import_simplexml($rootNode)->ownerDocument;

// Set DOM encoding to UTF-8.
$domSxe->encoding = 'UTF-8';

$dom = new DOMDocument('1.0', 'UTF-8');
$domSxe = $dom->importNode($domSxe, true);
$domSxe = $dom->appendChild($domSxe);

$path = "C:\\temp";

$dom->formatOutput = true;
$dom->save($path.'/sitemap.xml');

同时确保您添加的任何元素或CData实际上是UTF-8(请参阅utf8_encode())。

使用上面的例子,这对我有用:

php > var_dump($utf8);
string(11) "ᙀȾᎵ⁸"

php > $XMLNS = "http://www.sitemaps.org/schemas/sitemap/0.9";
php > $rootNode = new \SimpleXMLElement("<?xml version='1.0' encoding='UTF-8'?><urlset></urlset>");
php > $rootNode->addAttribute('xmlns', $XMLNS);
php > $url = $rootNode->addChild('url');

php > $url->addChild('loc', "Somewhere over the rainbow $utf8");

php > $domSxe = dom_import_simplexml($rootNode);
php > $domSxe->encoding = 'UTF-8';
php > $dom = new DOMDocument('1.0', 'UTF-8');
php > $domSxe = $dom->importNode($domSxe, true);
php > $domSxe = $dom->appendChild($domSxe);
php > $dom->save('./sitemap.xml');


$ cat ./sitemap.xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"><url><loc>Somewhere over the rainbow ᙀȾᎵ⁸</loc></url></urlset>

答案 1 :(得分:-1)

您的数据不得为UTF-8。你可以像这样转换它:

utf8_encode($yourData);

或者,也许:

iconv('ISO-8859-1', 'UTF-8', $yourData)