我想创建一个脚本来导出我的评论到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读取错误:bad composed
我不知道确切的翻译,但它崩溃在内容行。代码是这样生成的:
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;
}
然后写入文件
你知道应该是什么问题吗?
问题很可能是您的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
:(大端) -
0xFFFE0000
: UTF-32, little-endian -
0x0000FEFF
: UTF-32, big-endian
-
XML标准规定,如果不存在BOM,也不存在指示编码的XML声明,则默认情况下将文档解释为UTF-8编码。我认为,如果BOM(如果存在)和XML声明中指定的编码之间存在差异,则会发生什么情况,这是模糊的。
可能是您的文件有一个不正确的XML声明(例如,XML声明不应该说UTF-8
,而应该说ISO-8859-1
)
应该使用适当的XML库来生成XML。LibXML2与PHP捆绑在一起,可以从PHP的DOM API访问。这将处理编码问题,以及其他问题。与此类事情的通常情况一样,这是一项前期学习投资,其收益不会立即显现。但是有一个好处。