如何设置simplexml_load_string PHP函数的输出编码

时间:2013-01-13 17:45:05

标签: php encoding simplexml output

我用simplexml_load_string解析CP1250编码的字符串。所以,我在<?xml version="1.0" encoding="windows-1250"?>开头的字符串中说明它。不幸的是,所有节点都在simplexml_load_string输出中进行了UTF8编码。

有没有办法,如何指定输出编码,或者在使用输出时是否必须使用iconv?

1 个答案:

答案 0 :(得分:2)

我的问题并不完全清楚,所以我试着以我理解的方式回答这个问题,当时可能会给出答案。

如果加载CP1250 / Windows-1250编码的字符串,并且该字符串在XML declration中包含此编码信息,则通常默认情况下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>
    &#196;pfel wachsen &#252;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>

二进制八位字节C4FC无法显示为UTF-8,因此在我的情况下会显示。这也表明Windows-1250编码中的输出,否则显示会按原样显示这些字符。

我希望这甚至是有帮助的 - 正如我在回答的开头写的那样 - 从你所描述的内容来看,没有必要指定输出编码。如果您的结果与本答案中概述的不同,请分享您的PHP和libxml版本。