我正在尝试编写一个函数,它可以读取现有的 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 对象并插入旧文件中的所有数据?
最佳答案
我尝试了一下,发现使用 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>
关于php - SimpleXML 更改文件编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44411069/