1

我正在尝试使用 PHP 以 UTF-16 编码生成 XML 文件,但是当我打开生成的文件时出现问题。我使用 DOMDocument 创建文件。使用 UTF-8 编码,没问题。使用 Notepad++ 打开 XML 文件时,它看起来像这样:

<?xml version="1.0" encoding="UTF-16"?>਍㰀伀䈀㸀ഀ
<CLIENT>਍    㰀䈀伀䴀㸀ഀ
  <BO>਍        㰀䄀搀洀䤀渀昀漀㸀ഀ
      <Object>2</Object>਍          㰀嘀攀爀猀椀漀渀㸀㈀㰀⼀嘀攀爀猀椀漀渀㸀ഀ
    </AdmInfo>਍        㰀䈀甀猀椀渀攀猀猀倀愀爀琀渀攀爀猀㸀ഀ
      <row>਍   

         㰀䌀愀爀搀吀礀瀀攀㸀㠀㰀⼀䌀愀爀搀吀礀瀀攀㸀ഀ

... 等等 !!!有人能帮助我吗 ?

使用 Notepad++,我将编码设置为没有 BOM 的 UTF-8,文件看起来像这样:

 <?xml version="1.0" encoding="UTF-16"?>਍㰀伀䈀㸀ഀ
  <CLIENT>਍    㰀䈀伀䴀㸀ഀ
      <BO>਍        㰀䄀搀洀䤀渀昀漀㸀ഀ
          <Object>2</Object>਍          㰀嘀攀爀猀椀漀渀㸀㈀㰀⼀嘀攀爀猀椀漀渀㸀ഀ
        </AdmInfo>਍        㰀䈀甀猀椀渀攀猀猀倀愀爀琀渀攀爀猀㸀ഀ
          <row>਍            㰀䌀愀爀搀吀礀瀀攀㸀㠀㰀⼀䌀愀爀搀吀礀瀀攀㸀ഀ
            <CardCode>01000001</CardCode>਍          㰀⼀爀漀眀㸀ഀ
        </BusinessPartners>਍      㰀⼀䈀伀㸀ഀ
    </BOM>਍  㰀⼀䌀䰀䤀䔀一吀㸀ഀ

作为请求的 PHP 文件的一部分:

    header('Content-Type: text/xml');
                    //header('Content-Transfer-Encoding: binary');
                    $xml = new DOMDocument();
                    $xml->version='1.0';
                    $xml->encoding='UTF-16';
                    $ob_client = $xml->createElement('OB');
                        $client_element = $xml->createElement('CLIENT');
                            $client_bom_element = $xml->createElement('BOM');
                                $client_bo_element = $xml->createElement('BO');
                                    $client_adminfo_element = $xml->createElement('AdmInfo');
                                        $client_adminfo_object_element = $xml->createElement('Object', '2');
                                        $client_adminfo_version_element = $xml->createElement('Version', '2');

                                    $client_BusinessPartners_element = $xml->createElement('BusinessPartners');
                                        $client_BusinessPartners_row_element = $xml->createElement('row');
                                            $client_BusinessPartners_row_cardtype_element = $xml->createElement('CardType', $_XML_CardType);
                                            $client_BusinessPartners_row_cardcode_element = $xml->createElement('CardCode', $_XML_CardCode);

...
$xml->formatOutput = true;                  
                    echo $xml->saveXML();
                    $xml->save('rudy-xml-particulier'.$commandeId.'.xml');

非常感谢。

4

1 回答 1

2

您已经使用 UTF-16 生成了一个 XML 文件。您需要做的就是预先指定您所做的编码:

$doc = new DOMDocument();
$doc->encoding='UTF-16';

因此,当您添加数据,尤其是元素值时,问题更可能出现。PHP 不会给出任何警告,也不会阻止您添加非 UTF-8 字节序列。这是一个例子,甚至可以引起:

$_XML_CardType = "\xA9"; # non utf-8 byte-sequence (latin-1 copyright symbol)
$xml->createElement('CardType', $_XML_CardType); # returns DOMElement

然后当你使用

echo $xml->saveXML();

PHP 可能会告诉您问题(取决于 PHP 版本、错误报告设置和底层库)并且(对于较新的 PHP 版本)在发生错误的地方切断字符串。示例性错误消息是:

警告:DOMDocument::saveXML():由于转换错误,输出转换失败,字节 0xA9 0x3C 0x2F 0x69

因此,您需要做的就是确保createElement用于值的字符串数据是 UTF-8 编码的。这已经是您需要做的所有事情了。

当您说您从数据库中获取数据时,请查阅您的 PHP 数据库客户端库的文档,如何使其以 UTF-8 编码返回字符串。那应该可以立即解决您的问题。

为确保您在插入之前获得 UTF-8 编码的字符串,例如使用正则表达式来检测 Invalid UTF-8 String

if (!preg_match('//u', $_XML_CardType) {
    throw new Exception("Non utf-8 string deteced.");
}
$xml->createElement('CardType', $_XML_CardType);

这将引发异常而不是插入。还记录/显示错误并按照错误流发现其他问题。

于 2013-03-05T13:14:50.973 回答