2012-07-28 65 views
0

我有一個獲取位置的API。無法顯示從XML中獲取的特殊字符

使用Web瀏覽器,它顯示:

<placeID>5</placeID> 
<placeName>[email protected]#$%&*?/_"'()-+;</placeName> 
<rating>0</rating> 
<categoryID>2</categoryID> 
</place> 

使用HTTPGET和outputing安慰,它表明:

<place> 
<placeID>5</placeID> 
<placeName>[email protected]#$%&amp;*?/_&quot;'()-+;</placeName> 
<rating>0</rating> 
<categoryID>2</categoryID> 
</place> 

在Android上顯示地名,它顯示[email protected]#$%

我將原始數據庫中的字符串,並在API中使用htmlspecialchars($ placeName)。

問題與?~=\^[]{}&lt;&gt;:);):(:'(:o:P:$:S相同,它在控制檯上變成?~=\^[]{}&lt;&gt;:);):(:'(:o:P:$:S,在Android上變成?~=\^[]{}

我想在Android上顯示所有特殊字符,就像它存儲在數據庫中一樣。

+0

看到這可能會幫助你http://stackoverflow.com/a/10000095/1289716 – MAC 2012-07-28 09:45:46

+0

你爲什麼用' htmlspecialchars()'在你存儲到數據庫之前? – Adi 2012-07-28 10:10:32

+0

@Adnan:不,我在DB中存儲原始字符串「!@#$%&*?/ _」'() - +;「,在使用XML顯示它之前,我使用htmlspecialchars(), – Emerald214 2012-07-28 10:57:35

回答

1

網絡瀏覽器正在向您顯示第一個結果(未轉義),因爲它正在轉換& amp;到&進行顯示。如果您在瀏覽器中執行「查看源代碼」,您會看到它實際上是& amp;就像使用HttpGet一樣。這正是你想要發生的事情;你在控制檯中看到的是正確的。

這就是說,你不應該在Android中輸出該字符串時遇到任何問題,因爲它顯然已被正確轉義。那麼,問題很可能出在你的解析器,像在這個線程: Android SAX parser not getting full text from between tags

即使你不使用的SAXParser,您的解析代碼是你應該尋找一個問題,在這一點上,而不是在數據

爲了安全起見,請嘗試在API中使用htmlspecialchars中的ENT_QUOTES標誌,雖然在這種情況下似乎並不是問題所在。

我還應該提到,一旦你解決了這個問題,取決於你在Android上顯示文本的方式,它可能會像控制檯一樣顯示出來,在那裏你會看到諸如& amp;而不是&。如果是這樣的話,你將需要從這個線程中解碼XML的字符串:Java: How to unescape HTML character entities in Java?

+0

我使用元素,節點和org.w3c.dom包的NodeList遍歷XML在Java控制檯中,它顯示「!@# $%&*/_ 「'() - +;」?在Android logcat中顯示「!@#$%」。你可以幫幫我嗎? – Emerald214 2012-07-30 03:46:27

+1

沒有看到你的解析代碼,沒有其他的東西可以幫忙。如果您仍處於開發的初始階段,我建議修改您的API以輸出JSON而不是XML(或除此之外),因爲如果您使用JSONObject,則不會遇到類似的問題。 – ben 2012-08-01 16:57:09

+0

你的解決方案和這個http://stackoverflow.com/questions/11716147/why-dom-library-remove-the-escaped-special-character解決了我的問題。由於你的建議,我專注於解析代碼並提出一個關於它的問題。謝謝,我會把你的建議推薦給下一個項目。 – Emerald214 2012-08-02 01:43:59