2010-02-28 118 views
4

我開始接觸一些XML,看起來像這樣(簡化):解析XML特殊字符(UTF-8)

<?xml version="1.0" encoding="UTF-8"?> 
<alldata> 
    <data name="Forsetì" /> 
</alldata> 
</xml> 

但我已經與simplexml_load_string特殊字符解析之後(在我)變成:ì這顯然是很傷人的。

有沒有辦法來防止這種情況發生?

我知道XML是好的,當保存爲.txt並在瀏覽器中查看字符是好的。當我在XML上使用simplexml_load_string,然後將值保存爲文本文件或數據庫時,它的內容會變形。

+2

確實顯示頁面上的編碼是正確的? – jasonbar 2010-02-28 01:29:50

回答

6

這看起來是的SimpleXML創建一個UTF-8字符串,然後在ISO-8859-1(Latin-1的)或一些接近像CP-1252呈現。

當您將結果保存到文件並通過Web服務器提供該文件時,瀏覽器將使用文件中聲明的編碼。

包括在網頁中
因爲你的網頁編碼不是UTF-8,您需要將字符串轉換成什麼編碼您使用的,例如ISO-8859-1(Latin-1的)。

這是很容易使用的iconv()完成:

$xmlout = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $xmlout); 

保存到數據庫
您的數據庫列不使用UTF-8排序,所以你應該使用iconv的字符串轉換爲字符集你的數據庫使用。

假設您的數據庫排序規則與您所呈現的編碼規則相同,那麼在從數據庫讀取數據時就不必做任何事情。

說明
在UTF-8,一個爲0xC2前綴字節被用於訪問「拉丁補充-1」塊,其中包括的字符,如重音字母,貨幣符號,分數,上標2和上半3,版權和註冊商標符號,以及不間斷的空間。

但是在ISO-8859-1中,字節0xC2表示一個Â。所以當你的UTF-8字符串被誤解爲其中的一個時,你會得到Â後跟其他一些無意義的字符。

0

這很可能是XML很好,但字符在存儲或輸出時會受到損壞。

如果要在HTML頁面上輸出數據,請確保它以UTF-8編碼。如果您的HTML頁面在ISO-8859-1中,則可以使用utf8_decode作爲快速修復;從長遠來看,使用UTF-8是更好的選擇。

如果您要將數據存儲在mySQL中,則需要選擇UTF8作爲編碼:作爲連接的編碼,表中和列中的數據插入到數據中。

+0

我知道XML是好的,當保存爲.txt並在瀏覽器中查看字符是好的。當我在XML上使用simplexml_load_string,然後將值保存爲文本文件或數據庫時,它的內容會變形。 – Stomped 2010-02-28 02:00:33

0

我也有這個問題,它來自PHP腳本編碼。確保它被設置爲UTF-8。 如果仍然不好,請嘗試使用uft8_encode或utf8_decode打印變量。

0

XML是嚴格的,當涉及到實體,像&應該是&amp;amp;,我應該&amp;igrave;

所以,你需要一個轉換表。

function xml_entity_decode($_string) { 
    // Set up XML translation table 
    $_xml=array(); 
    $_xl8=get_html_translation_table(HTML_ENTITIES,ENT_COMPAT); 
    while (list($_key,)=each($_xl8)) 
     $_xml['&#'.ord($_key).';']=$_key; 
    return strtr($_string,$_xml); 
} 
+3

XML中唯一需要*用實體替換的字符是基本的五個標記字符:&符號,撇號,引號和尖括號。如果文檔的編碼不支持它們,則可能需要替換其他文檔,但這對UTF-8來說不是問題。 – 2010-02-28 12:29:37

0

晚會......但我已經遇到了這個問題,並解決如下。

你已經在XML中聲明瞭編碼,所以如果你使用DOMDocument加載xml文件,它不會引起任何問題。

但在情況下,它在其他用途​​的情況下發生的,你可以使用html_entity_decode象下面這樣:

html_entity_decode($xml->saveXML());