2013-04-15 131 views
0

與此類似question 我在使用XML產品,其中包含一些非法字符。我嚴重懷疑我可以讓他們解決問題,但我會嘗試。與此同時,我想要一個解決方法。XML中的項目符號「•」

問題是它包含一個子彈。它在我的源代碼中呈現爲「?」。我已經嘗試了一些編碼轉換,但還沒有找到可行的組合。 (我不習慣甚至考慮我的編碼類型,所以我在這裏不在我的元素中。)所以,我嘗試了下面的代碼,看起來str_replace不能識別「•」。 (它在我的文本編輯器中呈現爲高塊) 您可以看到我嘗試了幾個不同的東西的註釋行。

我試着STR更換「•」,然後再圍繞調整了,這是我最新的:

// deal with bullets in XML. 
$bullet="•"; //this was copied and pasted from transliterated text. 
//$data=iconv("UTF-8", "windows-1252//TRANSLIT", $data); //transliterate the text: 
//$data=str_replace($bullet,'•',$data); // replace the bullet char 
$data=str_replace($bullet,' - ',$data); // replace the bullet char 
//$data=iconv("windows-1252", "UTF-8", $data); // return the text to utf-8 encoding. 

任何想法如何剝離或更換該字符?如果有一個函數可以預先清理XML,那就太棒了,我不必擔心它。

+0

你確定'$ data'中沒有可能導致錯誤的其他字符嗎?如果你嘗試使用'DOMDocument :: loadHtml()'讀取文檔呢?如果xml無效,此方法更容易 – hek2mgl

+0

U + 2022是[XML中的合法字符](http://www.w3.org/TR/2000/REC-xml-20001006#charsets)。但是,它在名稱標記中無效。它如何被使用? –

+0

看看[這個帖子](http://stackoverflow.com/questions/11768839/utf-8-decode-for-php)和[這個資源,派。 3](http://blog.loftdigital.com/blog/php-utf-8-cheatsheet) - 他們告訴你如何設置php默認使用utf-8編碼,以及如何在不同的編碼之間進行轉換在個案基礎上做到這一點(但如果你必須這樣做,你應該真正問自己)。 – collapsar

回答

8

XML根據定義沒有非法字符。如果某個字符串包含不屬於XML的字符,那麼該字符串不是定義爲的XML

您關心的字符是Unicode的一部分。由於XML基於Unicode,這是個好消息。所以,讓我們命名你的目標是什麼:

所以你說現在它呈現爲•。因爲U + 2022在UTF-8中被編碼爲0xE2 0x80 0xA2,所以假設你採用UTF-8編碼的字符串(這是XML btw中使用的默認編碼)但命令軟件是或多或少安全的假設使得它把它當作一些單字節編碼,因此轉單碼點分成三個不同的角色:

相反,你需要指揮渲染應用程序以使用UTF-8編碼。這應該立即解決您的問題。因此,找到引入錯誤編碼的位置,您可能不需要重新編碼它,只是爲了正確提示編碼。

如果您想知道哪些單字節字符編碼在相應的字節(0xE2 0x80 0xA2)處具有這三個Unicode字符,則這是一個列表。我已經強調了最流行的一個:

  • ISO-8859-15(拉丁語9)
  • OEM 858(多語言拉丁文I +歐元)
  • 的Windows 1252(拉丁文I)
  • 的Windows 1254(土耳其)
  • 的Windows 1256(阿拉伯語)
  • 的Windows 1258(越南)
+0

您上面的粗體文本與我的文檔匹配。它說''我還沒有嘗試過改變它。我可能,但我擔心意外的後果。所以我正在尋找解決方法。這是爲了工作,老闆說它不夠重要,所以我會放棄它,但無論如何接受這個答案。至於你的第一段,谷歌搜索「[xml刪除非法字符](http://goo.gl/AQTjo)」的結果足以讓我相信編碼世界的其他部分不同意。 – TecBrat

+0

我的實際問題的解決方案,直到我可以編輯一個單獨的文件,是添加'AddDefaultCharset UTF-8'在我的.htaccess文件(apache)該網站的其餘部分似乎沒有受到這種強制字符集更改,它修理了我的破碎子彈。 – TecBrat