php - SimpleXML 更改文件编码

标签 php xml encoding utf-8 simplexml

我正在尝试编写一个函数,它可以读取现有的 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/

相关文章:

php - 在外观中定义类常量

java - 使用递归在 java 中查找 XML 文件中特定标记的出现次数

javascript和html字符转义

PHP 手动 GZip 编码

php文件下载而不是打开

php - 使用 id 打开 session

php - SQL SELECT 返回数组但 PHP 认为它为空

android - 什么是工具 :layout in fragment xml file?

android - 使用 LinearLayout 将按钮底部对齐

mysql - CakePHP 将值作为 HTML 编码值保存到 MySQL 数据库