【问题标题】:How to set output encoding of simplexml_load_string PHP function如何设置 simplexml_load_string PHP 函数的输出编码
【发布时间】:2013-01-13 17:45:04
【问题描述】:

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

有没有办法,如何指定输出编码,还是每次使用输出时都必须使用 iconv?

【问题讨论】:

    标签: php encoding simplexml output


    【解决方案1】:

    您的问题对我来说并不完全清楚,所以我尝试以我理解的方式回答它,可能已经给出了答案。

    如果您加载一个 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>
        &#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,所以在我的例子中显示 。这也表明输出 is 采用 Windows-1250 编码,否则显示屏将按原样显示这些字符。

    我希望这对您有所帮助 - 正如我的答案开头所写的那样 - 根据您的描述,没有必要指定输出编码。如果您的情况与此答案中概述的不同,请分享您的 PHP 和 libxml 版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2018-01-19
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多