【问题标题】:SimpleXML changing file encodingSimpleXML 更改文件编码
【发布时间】:2017-06-07 11:12:23
【问题描述】:

我正在尝试编写一个函数,该函数可以读取现有 XML 文件并使用第一个文件中的所有数据创建一个新文件,但编码不同。据我了解,SimpleXML 以 UTF-8 编码保存文件。我的原始 XML 文件是 Windows-1257。

代码:

public static function toUTF8()
{
    $remote_file = "data/test/import/test.xml";
    $xml = simplexml_load_file($remote_file);
    $xml->asXml('data/test/import/utf8/test.xml');

    echo var_dump('done');
    exit;
}

这种方式文件的编码还是不好。我想试试这个:

$newXML = new SimpleXMLElement($xml);

但这仅将纯 XML 代码作为参数。如何从对象中获取整个 XML 代码?或者我还能如何创建一个新的 UTF-8 XML 对象并插入旧文件中的所有数据?

【问题讨论】:

    标签: php xml encoding utf-8 simplexml


    【解决方案1】:

    我试过了,发现直接使用 SimpleXML 导入 XML 时出现问题。尽管 XML 中的编码声明正确,但它仍会输出错误的字符。因此,另一种方法是使用像iconv 这样的函数,它可以为您进行转换。

    如果你不需要解析XML,你可以直接这样做:

    <?php
    $remote_file = "data/test/import/test.xml";
    $new_file    = "data/test/import/utf8/test.xml";
    
    $baltic_xml  = file_get_contents($remote_file);
    $unicode_xml = iconv("CP1257", "UTF-8", $baltic_xml);
    
    file_put_contents($new_file, $unicode_xml);
    

    如果您需要对 XML 做一些事情,它会变得有点复杂,因为您必须更新 XML 声明中的字符集。

    <?php
    $remote_file = "data/test/import/test.xml";
    $new_file    = "data/test/import/utf8/test.xml";
    
    $baltic_xml  = file_get_contents($remote_file);
    $unicode_xml = iconv("CP1257", "UTF-8", $baltic_xml);
    $unicode_xml = str_replace('encoding="CP1257"', 'encoding="UTF-8"', $unicode_xml);
    
    $xml         = new SimpleXMLElement($unicode_xml);
    // do stuff with $xml
    $xml->asXml($new_file);
    

    我使用以下文件(另存为 CP1257)对此进行了测试,效果很好:

    <?xml version="1.0" encoding="CP1257"?>
    <Root-Element>
        <Test>Łų߯ĒČ</Test>
    </Root-Element>
    

    【讨论】:

      【解决方案2】:

      除非我错了,否则 SimpleXML 扩展将一直使用相同的编码。 UTF-8 是默认值,如果没有给出编码,但是如果原始文档有编码信息,则使用这种编码。

      您可以使用 DOMDocument 作为代理:

      $xml = simplexml_load_file(__DIR__ . '/test.xml');
      
      $doc = dom_import_simplexml($xml)->ownerDocument;
      $doc->encoding = 'UTF-8';
      
      $xml->asXml('as-utf-8.xml');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多