2011-01-28 75 views
2

我已經環顧四周,似乎並不能就這麼在這裏它找到一個解決方案。返回PHP的SimpleXML值有地方連字符的字符怪異和撇號

我有以下代碼:

$file = "adhddrugs.xml"; 
$xmlstr = simplexml_load_file($file); 
echo $xmlstr->report_description; 

這是一個簡單的版本,但即使這個嘗試任何連字符[R撇號變成:^一(歐元符號)商標標誌。

事情我已經試過有:

echo = (string)$xmlstr->report_description; /* did not work */ 
echo = addslashes($xmlstr->report_description); /* yes I know this doesnt work with hyphens, was mainly trying to see if I could escape the apostrophes */ 
echo = addslashes((string)$xmlstr->report_description); /* did not work */ 

也htmlspecial(我又知道不帶連字符的工作),ヶ輛,以及其他一些技巧。

現在的情況是,我從進料得到XML文件,所以我不能改變他們,但他們都非常標準。帶有連字符等的文本被封裝在cdata標籤中,並且編碼是UTF-8。如果我查看源代碼,我會在源代碼中顯示連字符和撇號。

現在只是爲了看看編碼是關閉或貼錯標籤或別的東西,奇怪,我試圖查看原始XML文件果然是正確顯示。

我相信,在我急於找到我忽略了一些簡單的答案,事實上,這確實是我曾經用過的SimpleXML第一次我錯過了一個非常簡單的解決方案。只是不要停靠我,我真的嘗試自己找到答案。

再次感謝。

+0

感謝這些人都看起來不錯,直到現在我沒有看到反應,我回家了,我會再次檢查那些謝天謝地,我會讓你知道 – BrandonS 2011-01-28 23:43:44

+0

如果你正在尋找解決方案,而馬特的答案是正確的,請閱讀Jasso和Takeshin的回答,因爲他們三人幫助解決問題1.解釋原因2.解釋如何解決它3.幫助設置simpleXML中的幫助解決問題O操作。使用其中的一個可能會解決這個問題,但是查看所有答案將確保它解決問題並幫助您理解問題,以便您不會再犯這個錯誤。謝謝。 – BrandonS 2011-01-31 14:37:18

回答

2

你知道文檔的字符集嗎?

如果您尚未打印任何內容,您可以在打印任何內容之前執行header('Content-Type: text/html; charset=utf-8');

+0

完美效果很棒!謝謝,我不知道爲什麼我現在沒有嘗試過。我想我認爲這個問題比一個簡單的標題標籤問題要大。再次感謝。 – BrandonS 2011-01-31 14:27:54

2

確保您已設置了SimpleXML來使用UTF-8。

確保所有實體使用16進制,而不是HTML實體編碼。

也說不定:

$string = html_entity_decode($string, ENT_QUOTES, "utf-8"); 

會有所幫助。

+0

謝謝,我確信SimpleXML使用的是UTF-8,而理論上的代碼示例應該與使用頭文件相同,但它似乎不起作用。部分答案與Matt和Jasso一起解決了問題。那謝謝啦。 – BrandonS 2011-01-31 14:31:52

4

這是一個簡單的版本,但即使 嘗試這種任何連字符撇號 都變成:^一(歐元符號) 商標標誌。

這是由不正確的字符集猜測(和可能的重新編碼)造成的。

如果文本包含「捲曲撇號」=「右單引號」= U + 2019個字符,則將其保存爲UTF-8編碼結果的字節數爲0xE2 0x80 0x99。如果相同的文件然後再次被讀取假設它的字符集是windows-1252,則撇號字符(0xE2 0x80 0x99)的字節流被解釋爲字符’(=具有旋繞,歐元符號,商標符號的小「a」)。再次,如果這個不正確解釋的文本保存爲UTF-8,原始字符將導致字節流0xC3 0xA2 0xE2 0x82 0xAC 0xE2 0x84 0xA2

摘要:您的原始數據是UTF-8,並且您的代碼的一部分讀取數據時假定它是windows-1252(或ISO-8859-1,通常實際上被視爲windows-1252)。這個字符集假設的一個可能的原因是HTTP的默認字符集是ISO-8859-1。 '當發件人未提供明確的字符集參數時,「文本」類型的媒體子類型定義爲在通過HTTP接收時具有默認字符集值「ISO-8859-1」。來源:RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1

PS。這是一個非常普遍的問題。只要進行Google搜索或Bing搜索,查詢doesn’t -doesn't,您就會看到許多頁面具有相同的編碼錯誤。

0

這是在頁面的<head>部分聲明不正確字符集的症狀(或者不聲明和使用缺省字符集(不帶重音符號和特殊字符))。

這對拉丁語言有訣竅。

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

總新手,對於瀏覽器的HTML頁面有一個基本的佈局,用頭或報頭用來告訴瀏覽器對頁面的一些基本的東西,以及預載了一些腳本,該頁面將使用實現其功能。

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
    Hello world 
</body> 
</html> 

如果省略<head>部分,HTML將使用默認設置(需要一些東西是理所當然的 - 就像使用northamerican字符集,這還不包括許多重音字母,界河顯示爲「怪異字符」