PHP DOMDocument::save() 保存为 ASCII 而不是 UTF-8
PHP DOMDocument::save() saves as ASCII instead of UTF-8
我正在使用 DOMDocument
和 SimpleXMLElement
创建格式化的 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。这让我很困惑。
您的数据不得采用 UTF-8 格式。你可以这样转换它:
utf8_encode($yourData);
或者,也许:
iconv('ISO-8859-1', 'UTF-8', $yourData)
我认为这里发生了几件事。首先,您需要:
$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>
我正在使用 DOMDocument
和 SimpleXMLElement
创建格式化的 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。这让我很困惑。
您的数据不得采用 UTF-8 格式。你可以这样转换它:
utf8_encode($yourData);
或者,也许:
iconv('ISO-8859-1', 'UTF-8', $yourData)
我认为这里发生了几件事。首先,您需要:
$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>