如何使用PHP使用UTF-16编码生成有效的XML文件

如何使用PHP使用UTF-16编码生成有效的XML文件,php,xml,character-encoding,domdocument,utf-16,Php,Xml,Character Encoding,Domdocument,Utf 16,我试图用PHP生成一个UTF-16编码的XML文件,但打开生成的文件时出现问题。 我使用DOMDocument创建文件。 使用UTF-8编码,没有问题。 使用Notepad++打开XML文件时,如下所示: <?xml version="1.0" encoding="UTF-16"?>਍㰀伀䈀㸀ഀ <CLIENT>਍    㰀䈀伀䴀㸀ഀ <BO>਍        㰀䄀搀洀䤀渀昀漀㸀ഀ <Object>2</Object>਍

我试图用PHP生成一个UTF-16编码的XML文件,但打开生成的文件时出现问题。 我使用DOMDocument创建文件。 使用UTF-8编码,没有问题。 使用Notepad++打开XML文件时,如下所示:

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

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

非常感谢。

您已经使用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():由于conv错误,输出转换失败,字节为0xA9 0x3C 0x2F 0x69

因此,您需要做的就是确保与值一起使用的
createElement
字符串数据是UTF-8编码的。这已经是你需要做的全部了

正如您所说的从数据库获取数据,请参考PHP数据库客户端库的文档,了解如何使其以UTF-8编码返回字符串。这会立即解决你的问题

为确保随后在UTF-8编码中获得字符串,请在插入之前对其进行测试,例如,使用:


这将抛出异常,而不是插入异常。此外,还可以根据错误流查找其他问题。

记事本++是否没有使用其他编码查看文件的选项?我肯定是的,但不能在我的mac上查看。我刚刚更新了我的帖子,但失败了。也许是因为我不会说中文,但我看不出这两个文件之间的区别。另外,你确定你的PHP代码是正确的吗?如果我设置了UTF-8编码,就不会有错误!向我们展示如何在PHP中对文档应用UTF-16编码以及如何发送数据。非常感谢Hakre!我将应用你所说的。
$_XML_CardType = "\xA9"; # non utf-8 byte-sequence (latin-1 copyright symbol)
$xml->createElement('CardType', $_XML_CardType); # returns DOMElement
echo $xml->saveXML();
if (!preg_match('//u', $_XML_CardType) {
    throw new Exception("Non utf-8 string deteced.");
}
$xml->createElement('CardType', $_XML_CardType);