由于UTF8编码错误导致XML读取错误

时间:2011-05-06 17:57:58

标签: php xml utf-8 disqus

我正在尝试创建一个脚本来将我的评论导出到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到一个文件。

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

2 个答案:

答案 0 :(得分: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,little-endian
    • 0xFEFF :( big-endian)
    • 0xFFFE0000:UTF-32,little-endian
    • 0x0000FEFF:UTF-32,big-endian

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

可能是您的文件的XML声明不正确(例如,而不是说UTF-8,XMl声明应该说ISO-8859-1

答案 1 :(得分:0)

您应该使用适当的XML库来生成XML。 LibXML2与PHP捆绑在一起,可从PHP's DOM API访问。除了其他方面,这将处理编码问题。通常情况就是如此,这是一项前期学习投资,其好处不会立即明确。但是有一个好处。