您的问题对我来说并不完全清楚,所以我尝试以我理解的方式回答它,可能已经给出了答案。
如果您加载一个 CP1250/Windows-1250 编码字符串,并且该字符串在 XML 声明中包含此编码信息,通常默认情况下 simplexml 已经为输出保留此信息。所以通常你不需要在这里做任何事情。
如果您需要明确设置输出编码:
SimpleXMLElement 不允许您自己更改编码。然而,通常当 SimpleXML 不能自己完成时,姐妹库DOMDocument 能够做到。因为是姐妹,所以可以互相交流。在以下示例中,我加载了一个 UTF-8 编码的字符串,然后将 xml 输出编码显式设置为 US-ASCII:
$inputUTF8 = <<<INPUT
<?xml version="1.0" encoding="UTF-8"?>
<root>
Äpfel wachsen überirdisch
</root>
INPUT;
$xml = simplexml_load_string($inputUTF8); // load UTF-8 encoded string
$xml->asXML('php://output'); // outputs as UTF-8 (same as input by default)
// set document encoding to US-ASCII via DOMDocument
$doc = dom_import_simplexml($xml)->ownerDocument;
$doc->encoding = 'US-ASCII';
$xml->asXML('php://output'); // outputs as US-ASCII
输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
Äpfel wachsen überirdisch
</root>
<?xml version="1.0" encoding="US-ASCII"?>
<root>
Äpfel wachsen überirdisch
</root>
如图所示,DOMDocument::$encoding 属性甚至改变了SimpleXMLElement 的输出编码,不属于字符集的字符也被表示为其 Unicode 代码点的数字 XML 实体(此处为 Ä是 U+00C4,它是十进制 196 的十六进制。使用 Windows-1250 作为输出编码会在屏幕上出现未知字符错误:
// set document encoding to Windows-1250 via DOMDocument
$doc = dom_import_simplexml($xml)->ownerDocument;
$doc->encoding = 'Windows-1250';
$xml->asXML('php://output'); // outputs as Windows-1250
输出(UTF-8 显示):
<?xml version="1.0" encoding="Windows-1250"?>
<root>
�pfel wachsen �berirdisch
</root>
二进制八位字节 C4 和 FC 不能显示为 UTF-8,所以在我的例子中显示 �。这也表明输出 is 采用 Windows-1250 编码,否则显示屏将按原样显示这些字符。
我希望这对您有所帮助 - 正如我的答案开头所写的那样 - 根据您的描述,没有必要指定输出编码。如果您的情况与此答案中概述的不同,请分享您的 PHP 和 libxml 版本。