Java 解决采集UTF-8网页空格变成问号乱码
http://blog.csdn.net/bob007/article/details/27098875
?
使用此方法轉(zhuǎn)換后,在列表中看到的正常,但是在詳情頁(yè)的文本框中查看到的就是 了,只好過(guò)濾掉所有的空格
html = html.replaceAll(UTFSpace, " ");改為html = html.replaceAll(UTFSpace, "");
?
--------------以下復(fù)制而來(lái)-------------
昨天發(fā)現(xiàn),用 HtmlDecode() 去解碼后,“ ”不是被解碼為半角的空格(ASCII碼0x20)而是變成半角問(wèn)號(hào)“?”(ASCII碼0x3F)。而且奇怪的是,只有每行前面的空格才會(huì)出問(wèn)題,如果前面后面有漢字的話,空格就還是空格。但是更加奇怪的是,如果直接在HtmlDecode()的后面直接加上trim()的話,這個(gè)問(wèn)號(hào)會(huì)被去掉。而正常的情況下,問(wèn)號(hào)是不會(huì)被去掉的,只有空格才會(huì)被去掉。
? ? ? 發(fā)生這個(gè)問(wèn)題的時(shí)候,我是在把解碼后的內(nèi)容寫入數(shù)據(jù)庫(kù),因此一直都以為是sql******與應(yīng)用程序之間的字符集問(wèn)題或者編碼方式問(wèn)題。搞了N久,最后才發(fā)現(xiàn)在送進(jìn)Sql******之前,內(nèi)容就已經(jīng)是問(wèn)號(hào)了。
? ? ? 查了很久,也找不到這個(gè)問(wèn)題如何解決。因此,只能使用山寨解決方法了:
轉(zhuǎn)自http://www.jiaonan.tv/html/blog/1/29483.htm
? ? ? 1、在Decode之前替換 為 空格。
? ? ? 2、在Decode之后直接加 Trim()
? ? ? 顯而易見的,這個(gè)不是一個(gè)好辦法:在顯示到瀏覽器的時(shí)候,空格就不見了
? ? ? 最近認(rèn)真去查了一下這個(gè)問(wèn)題,發(fā)現(xiàn)問(wèn)題的關(guān)鍵,是編碼方式:如果使用的Encoding是UTF-8的話,就會(huì)發(fā)生這種情況。
? ? ? 問(wèn)題的根源,在于UTF-8這種編碼里面,存在一個(gè)特殊的字符,其編碼是“0xC2 0xA0”,轉(zhuǎn)換成字符的時(shí)候,表現(xiàn)為一個(gè)空格,跟一般的半角空格(ASCII 0x20)一樣,唯一的不同是它的寬度不會(huì)被壓縮,因此比較多的被用于網(wǎng)頁(yè)排版(如首行縮進(jìn)之類)。而其他的編碼方式如GB2312、Unicode之類并沒有這樣的字符,因此如果簡(jiǎn)單地進(jìn)行編碼轉(zhuǎn)換,生成地GB2312/Unocode字符串中,這個(gè)字符就會(huì)被替換成為問(wèn)號(hào)(ASCII ox3F)。此時(shí)如果進(jìn)行寫庫(kù)、寫文件之類,就會(huì)把問(wèn)號(hào)直接寫入了。當(dāng)然此時(shí)會(huì)有一種山寨方式:直接替換問(wèn)號(hào)為空格??墒沁@種方法,會(huì)把原本真正的問(wèn)號(hào)也*斃掉。
? ? ? 使用UTF-8進(jìn)行HTMLDecode的時(shí)候,對(duì)于語(yǔ)句開頭的( ),就會(huì)被自動(dòng)轉(zhuǎn)換成為這個(gè)特殊的空格,可能是判斷為放在開頭的空格,一定是用來(lái)排版的。在轉(zhuǎn)換為其他編碼之前,這個(gè)特殊的空格受到的待遇與普通的半角空格是一致的,甚至也會(huì)被trim()去掉。
? ? ? 因此,碰到這個(gè)問(wèn)題的原因有兩種:一種是在UTF-8編碼下進(jìn)行了轉(zhuǎn)換,產(chǎn)生了這個(gè)字符;還有一種就是網(wǎng)頁(yè)中直接采用了這個(gè)字符進(jìn)行排版。
? ? ? 知道了具體原因,就有正規(guī)的解決方法了。方法就是:在得到UTF-8字符串之后,先進(jìn)行一個(gè)替換,把這個(gè)特殊的空格替換為普通的空格,如果是HTML串,建議替換為( )。C#代碼如下:
| ? ? ? byte[] space = new byte[]{0xc2,0xa0};? ? ? string UTFSpace = Encoding.GetEncoding("UTF-8").GetString(space);? ? ? HtmlStr = HtmlStr.Replace(UTFSpace," "); ? java版: ?? ??? ???? byte bytes[] = {(byte) 0xC2,(byte) 0xA0}; |
? ? ? 這樣做,就不會(huì)把串里面本來(lái)應(yīng)該有的問(wèn)號(hào)錯(cuò)誤的替換為空格。也不會(huì)看到討厭的問(wèn)號(hào),能保存原來(lái)字符串的真面目了。
? ? ? 需要強(qiáng)調(diào)的是,替換之前不能進(jìn)行編碼轉(zhuǎn)換,一定要繼續(xù)使用UTF-8編碼。如果已經(jīng)轉(zhuǎn)換成其他編碼,那么錯(cuò)誤就已經(jīng)不可逆轉(zhuǎn)了。沒有辦法再區(qū)分這個(gè)錯(cuò)誤的問(wèn)號(hào)和正常的問(wèn)號(hào)之間的差別了。
轉(zhuǎn)載于:https://www.cnblogs.com/jcz1206/p/4344686.html
總結(jié)
以上是生活随笔為你收集整理的Java 解决采集UTF-8网页空格变成问号乱码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 数据分析告诉你为什么Apple Watc
- 下一篇: 【java】【乱码】Java 读取本地