我用simplexml_load_string
解析CP1250编码的字符串。所以,我在<?xml version="1.0" encoding="windows-1250"?>
开头的字符串中说明它。不幸的是,所有节点都在simplexml_load_string
输出中进行了UTF8编码。
有没有办法,如何指定输出编码,或者在使用输出时是否必须使用iconv?
答案 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>
Ä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,因此在我的情况下会显示�
。这也表明Windows-1250编码中的输出是,否则显示会按原样显示这些字符。
我希望这甚至是有帮助的 - 正如我在回答的开头写的那样 - 从你所描述的内容来看,没有必要指定输出编码。如果您的结果与本答案中概述的不同,请分享您的PHP和libxml版本。