【问题标题】:XML read error because of bad UTF8 encoding由于 UTF8 编码错误导致 XML 读取错误
【发布时间】:2011-05-06 17:57:58
【问题描述】:

我正在尝试创建一个脚本来将我的 cmets 导出到 Disqus,为此,我需要创建一个巨大的 XML 文件。

我的 UTF 8 编码有问题。应该是 UTF-8 文件,但我需要制作 utf8_decode 才能正确显示我的西班牙语元素。

生成的文件是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:dsq="http://www.disqus.com/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:wp="http://wordpress.org/export/1.0/"
>
<channel>
    <wp:comment>
        <wp:comment_id>26</wp:comment_id>
        <wp:comment_author>KA_DIE</wp:comment_author>
        <wp:comment_author_email> </wp:comment_author_email>
        <wp:comment_author_url></wp:comment_author_url>
        <wp:comment_author_IP> </wp:comment_author_IP>
        <wp:comment_date_gmt>2009-07-16 18:53:19</wp:comment_date_gmt>
        <wp:comment_content><![CDATA[WTF TEH Gladios en español <br />tnx tnx <br />me usta mucho esa web estoy pendiente mucho se su actualziacion es buen saber ke esta en español <br />x que solo entendia el 80, 90% de la paguina jiji]]></wp:comment_content>
        <wp:comment_approved>1</wp:comment_approved>
        <wp:comment_parent>0</wp:comment_parent>
    </wp:comment>
</channel>
</rss>

出于安全原因(例如 IP 或电子邮件)已删除数据。如您所见,它包含“ñ”字母。但是显示的 XML 会引发错误:

XML 读取错误:组合错误

我不知道确切的翻译,但它在内容行中崩溃了。代码是这样生成的:

public function generateXmlElement (){
            $xml = "<wp:comment>
                        <wp:comment_id>$this->id</wp:comment_id>
                        <wp:comment_author>$this->author</wp:comment_author>
                        <wp:comment_author_email>$this->author_email</wp:comment_author_email>
                        <wp:comment_author_url>$this->author_url</wp:comment_author_url>
                        <wp:comment_author_IP>$this->author_ip</wp:comment_author_IP>
                        <wp:comment_date_gmt>$this->date</wp:comment_date_gmt>
                        <wp:comment_content><![CDATA[$this->content]]></wp:comment_content>
                        <wp:comment_approved>$this->approved</wp:comment_approved>
                        <wp:comment_parent>0</wp:comment_parent>
            </wp:comment>";
            return $xml;
        }

然后fwrite到一个文件。

你知道应该是什么问题吗?

【问题讨论】:

    标签: php xml utf-8 disqus


    【解决方案1】:

    问题很可能是您的 XML 不是 UTF-8 编码的,但实际上是别的东西(ISO-8859-1?)。字符 'ñ' (U+00F1) 在 UTF-8 中编码为 2 个八位字节 0xC3B1。在 Windows 1252 代码页和 ISO-8859 编码中,“ñ”是单个八位字节 0xF1。

    您的 XML 文件的开头是否有 Unicode BOM (U+FEFF)? BOM(如果存在)指示编码和字节顺序。

    • 0xEFBBBF:UTF-8。字节顺序并不重要。
    • 字节顺序对于 UTF-16 和 UTF-32 很重要:
      • 0xFFFE: UTF-16,小端序
      • 0xFEFF:(大端)
      • 0xFFFE0000: UTF-32,小端序
      • 0x0000FEFF: UTF-32,大端

    XML 标准规定,如果不存在 BOM 并且不存在指示编码的 XML 声明,则默认情况下应将文档解释为 UTF-8 编码。我相信如果它们是 BOM(如果存在)和 XML 声明中指定的编码之间的差异,会发生什么情况是模糊的。

    您的文件可能有一个不正确的 XML 声明(例如,XMl 声明应该写成 ISO-8859-1,而不是 UTF-8。

    【讨论】:

    • 我从 fwrite 创建文件,所以它似乎没有用 UTF-8 对其进行编码。它确实有 UTF8 声明,但它不是 UTF8 编码的。我用记事本++打开XML文件并将其重新编码为UTF8,保存并解决。如何在 PHP 脚本上做到这一点?
    【解决方案2】:

    您应该使用适当的 XML 库来生成 XML。 LibXML2 与 PHP 捆绑在一起,可从 PHP's DOM API 访问。这将处理编码问题等。与此类事情的通常情况一样,这是一项前期学习投资,其好处不会立即显现出来。但是有一个好处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      • 1970-01-01
      • 2013-03-27
      • 2015-01-25
      • 1970-01-01
      • 2010-11-29
      • 1970-01-01
      相关资源
      最近更新 更多