問題重現(xiàn)
昨天一早到公司,測(cè)試就給我說了一個(gè)Bug艘策,關(guān)于一個(gè)消息通知顯示的問題,正常的消息應(yīng)該顯示為:
恭喜XXX在XXX房間抽中XXX
一直也是正常顯示的。那天突然就出現(xiàn)了一個(gè)異常顯示:
恭喜 ? ? ? ? ? ? ??
問題原因? ? ?
通知后面的消息全都沒有了堤框。然而我自己在測(cè)試的N次中一直都沒有復(fù)現(xiàn),直到一個(gè)偶然的機(jī)會(huì)纵柿,突然看到我的應(yīng)用中飄過一條消息:“恭喜??????????????? ”蜈抓,大驚,趕快看日志昂儒,發(fā)現(xiàn)這是一個(gè)名為“&¥#@沟使,。渊跋,腊嗡。”一堆亂七八糟的符號(hào)問昵稱的用戶發(fā)的消息拾酝,我趕快找測(cè)試問這是誰發(fā)的燕少,讓再來幾發(fā)。中間又經(jīng)過一堆排除蒿囤,最終發(fā)現(xiàn)異常是由于“&”符號(hào)引起的客们。
通知在顯示時(shí)是通過拼接的一個(gè)HTML的<span>標(biāo)簽,然后進(jìn)行解析顯示的,XXX都有自己的樣式底挫,如顏色這些恒傻。我開始就懷疑是HTML標(biāo)簽中出現(xiàn)“ & ”符號(hào),引起的異常建邓,在查了一些資料和又把前人的代碼查看了一番后盈厘,發(fā)現(xiàn)這個(gè)HTML文本,最終是以XML格式進(jìn)行解析涝缝,然后拆分為不同字符串進(jìn)行展示的扑庞,最終定位到了問題,由于XmlPullParser在解析時(shí)不能出現(xiàn)&符號(hào)拒逮,因?yàn)?amp;符號(hào)是節(jié)點(diǎn)字符罐氨,所以不能直接使用,需要進(jìn)行處理滩援。
解決方法
在定位到問題后栅隐,就好辦了。在此記錄一下解決方式玩徊,以備后用租悄。
<? ? ????? <??????? 小于號(hào)
>? ?????? > ? ? ?? 大于號(hào)
&???? & ? ? ?? 和號(hào)
'???? ' ? ? ? ? 單引號(hào)
"???? "???????? 雙引號(hào)
注釋:嚴(yán)格的說,在XML中只有字符“&”和字符“<”是非法的恩袱。注意最后的" ; "不能少泣棋。
"<" 會(huì)產(chǎn)生錯(cuò)誤,因?yàn)榻馕銎鲿?huì)把該字符解釋為新元素的開始畔塔。
"&" 也會(huì)產(chǎn)生錯(cuò)誤潭辈,因?yàn)榻馕銎鲿?huì)把該字符解釋為字符實(shí)體的開始。
非法的 XML 字符必須被替換為實(shí)體引用(entity reference)澈吨。
假如在 XML 文檔中放置了一個(gè)類似 "<" 或 "&" 字符把敢,那么這個(gè)會(huì)產(chǎn)生一個(gè)錯(cuò)誤:
XmlPullParserException: unterminated entity ref
<message>if salary < 1000 & then</message>
為了避免此類錯(cuò)誤,需要把字符 "<" 替換為實(shí)體引用谅辣,就像這樣:
<message>if salary < 1000 &? then</message>
在解析中當(dāng)有一大片的內(nèi)容不需要解析時(shí)修赞,可以考慮CDATA。術(shù)語 CDATA 指的是不應(yīng)由 XML 解析器進(jìn)行解析的文本數(shù)據(jù)(Unparsed Character Data)桑阶。
CDATA 部分由 "<![CDATA[" 開始柏副,由 "]]>" 結(jié)束。具體可以去查找一下資料蚣录。