2011-05-06 108 views
0

我正在嘗試創建一個腳本來將我的註釋導出到Disqus,爲了做到這一點,我需要創建一個巨大的XML文件。由於錯誤的UTF8編碼導致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到一個文件。

你知道應該是什麼問題嗎?

回答

0

您應該使用合適的XML庫生成XML。libxml2的來與PHP捆綁在一起,可從PHP's DOM API獲得,這將處理編碼問題等等。這種情況通常是這種情況,這是一種前期學習投資,它的好處不會立即明確,但是有益處。

1

問題很可能是您的XML不是UTF-8編碼,而是實際上是其他內容(ISO-8859-1?)。字符'&ntilde;' (U + 00F1)以UTF-8編碼爲2個八位位組0xC3B1。在Windows 1252代碼頁和ISO-8859編碼中,'&ntilde'是一個八位字節0xF1。

您的XML文件在文件開頭是否有Unicode BOM(U + FEFF)? BOM(如果存在)表示編碼和字節順序。

  • 0xEFBBBF:UTF-8。字節順序不重要。
  • 字節順序是顯着性爲UTF-16和UTF-32:
    • 0xFFFE:UTF-16,小端
    • 0xFEFF:(大端)
    • 0xFFFE0000:UTF-32,little-尾數
    • 0x0000FEFF:UTF-32,大端

XML標準說,如果沒有BO M存在,並且不存在指示編碼的XML聲明,該文檔應默認被解釋爲UTF-8編碼。我相信如果它們是BOM(如果存在)與XML聲明中指定的編碼之間的差異,會發生什麼情況。

這可能是因爲你的文件有一個不正確的XML聲明(例如,而不是說UTF-8,XML聲明應該說像ISO-8859-1

+0

我從fwrite創建文件,所以它似乎沒有用UTF-8編碼它,它確實有UTF8聲明,但它不是UTF8編碼。我打開並用Notepad ++將XML文件重新編碼爲UTF8,保存並解決。我怎樣才能在PHP腳本上做到這一點? – 2011-05-06 19:13:29