2011-05-30 78 views
2

我試圖用xml獲得一個值,但是當我嘗試給出奇怪的代碼時。從XML獲得價值後的奇怪字符php

$xmlDate = $searchNode->getElementsByTagName("kostenvoorverkoop"); 
$valueKostenvoorverkoop = htmlentities($xmlDate->item(0)->nodeValue,ENT_QUOTES,"UTF-8"); 
//gives back Á€10,- instead of €10,- 

找不到問題。

//XML 
<?xml version="1.0" encoding="ISO-8859-1" ?> 
<price>€10</price> 

如果我離開ヶ輛它給出了一個完全wierde串像AAU%10 < ----不完全是這樣,但你知道我的意思。

如果有人可以幫助我,這將幫助我很大,在此先感謝。

編輯: 找到一個小的工作:改變€&amp;euro;。知道不乾淨,但工作。

+0

ISO-8859-1與UTF-8完全不同...... – Flukey 2011-05-30 15:15:16

+2

ISO-8859-1 **不包含**歐元字符'€'。這意味着在XML聲明中聲明的編碼是不正確的,並且您的XML在技術上不是完整的。可能您的文檔是ISO-8859-15或windows-1252(或UTF-8可能包含無效的字節序列)。 – jasso 2011-05-30 15:30:01

回答

3

字符並不在ISO 8859的存在,所以這個XML聲明不可能是對。

輸出Á€表明該文件實際上已在Windows代碼頁1252(西歐)中編碼,該代碼與ISO-8859-1相似,但在0x80-0x9F範圍內具有不同的字符,包括歐元符號。

PHP已將數據解析爲ISO-8859-1,其中(字節0x80)的CP1252編碼映射到控制字符U + 0080。然後它將包含U + 0080的Unicode字符串作爲UTF-8編碼的字節字符串U + 00C2,U + 0080提供給您。將其輸出到作爲cp1252,ISO-8859-1(用於繁瑣的混淆遺留原因)或沒有西歐機器上的字符集的頁面中的瀏覽器時,給出Á€htmlentities()不以任何方式進行編碼,因爲控制碼U + 0080沒有HTML實體。

這裏是你應該如何進行:

  • 如果你必須在你的CP1252 XML輸入文件,狀態,在XML聲明的encoding="windows-1252",而不是不準確ISO-8859-1。然而,XML解析器不需要讀取cp1252,所以更好的互操作性就是使用默認的UTF-8編碼並重新保存文件以匹配。

  • 使用Content-Type標頭或元標記將您的輸出HTML頁面作爲UTF-8提供。然後使用htmlspecialchars()而不是htmlentities(),這樣您就不會浪費時間編碼不需要它的非ASCII字符。

+0

如果對輸入格式沒有任何控制權,第三個選項是使用[iconv()](http://php.net/iconv)進行預處理。 – Mel 2011-05-30 15:58:41

+0

我將它改爲'encoding =「windows-1252」',但我仍然通過發送'&歐元;'到xml找到了一個小的工作,在€符號 – Luuky19 2011-05-31 08:59:28

+0

的前面。這將最終成爲€符號。不乾淨,但它的工作 – Luuky19 2011-05-31 11:15:06

0

您是否嘗試將xml中的編碼從ISO-8859-1更改爲UTF-8? 或者只是把PHP的,當你正在解碼此charset ISO-8859-1 ..