日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

Java 解决采集UTF-8网页空格变成问号乱码

發(fā)布時(shí)間:2025/3/8 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 解决采集UTF-8网页空格变成问号乱码 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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};
?? ??? ??? ?String UTFSpace = new String(bytes,"utf-8");
?? ??? ??? ?html = html.replaceAll(UTFSpace, " ");

? ? ? 這樣做,就不會(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。