Java 解決採集UTF-8網頁空格變成問號亂碼

來源:互聯網
上載者:User

標籤:

http://blog.csdn.net/bob007/article/details/27098875

 

使用此方法轉換後,在列表中看到的正常,但是在詳情頁的文字框中查看到的就是 了,只好過濾掉所有的空格

html = html.replaceAll(UTFSpace, " ");改為html = html.replaceAll(UTFSpace, "");

 

--------------以下複製而來-------------

昨天發現,用 HtmlDecode() 去解碼後,“ ”不是被解碼為半形的空格(ASCII碼0x20)而是變成半形問號“?”(ASCII碼0x3F)。而且奇怪的是,只有每行前面的空格才會出問題,如果前面後面有漢字的話,空格就還是空格。但是更加奇怪的是,如果直接在HtmlDecode()的後面直接加上trim()的話,這個問號會被去掉。而正常的情況下,問號是不會被去掉的,只有空格才會被去掉。
      發生這個問題的時候,我是在把解碼後的內容寫入資料庫,因此一直都以為是sql******與應用程式之間的字元集問題或者編碼方式問題。搞了N久,最後才發現在送進Sql******之前,內容就已經是問號了。

      查了很久,也找不到這個問題如何解決。因此,只能使用山寨解決方案了:
轉自http://www.jiaonan.tv/html/blog/1/29483.htm
      1、在Decode之前替換   為 空格。

      2、在Decode之後直接加 Trim()

      顯而易見的,這個不是一個好辦法:在顯示到瀏覽器的時候,空格就不見了

      最近認真去查了一下這個問題,發現問題的關鍵,是編碼方式:如果使用的Encoding是UTF-8的話,就會發生這種情況。

      問題的根源,在於UTF-8這種編碼裡面,存在一個特殊的字元,其編碼是“0xC2 0xA0”,轉換成字元的時候,表現為一個空格,跟一般的半形空格(ASCII 0x20)一樣,唯一的不同是它的寬度不會被壓縮,因此比較多的被用於網頁排版(如首行縮排之類)。而其他的編碼方式如GB2312、Unicode之類並沒有這樣的字元,因此如果簡單地進行編碼轉換,產生地GB2312/Unocode字串中,這個字元就會被替換成為問號(ASCII ox3F)。此時如果進行寫庫、寫檔案之類,就會把問號直接寫入了。當然此時會有一種山寨方式:直接替換問號為空白格。可是這種方法,會把原本真正的問號也*斃掉。

      使用UTF-8進行HTMLDecode的時候,對於語句開頭的( ),就會被自動轉換成為這個特殊的空格,可能是判斷為放在開頭的空格,一定是用來排版的。在轉換為其他編碼之前,這個特殊的空格受到的待遇與普通的半形空格是一致的,甚至也會被trim()去掉。

      因此,碰到這個問題的原因有兩種:一種是在UTF-8編碼下進行了轉換,產生了這個字元;還有一種就是網頁中直接採用了這個字元進行排版。


      知道了具體原因,就有正規的解決方案了。方法就是:在得到UTF-8字串之後,先進行一個替換,把這個特殊的空格替換為普通的空格,如果是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, " ");

      這樣做,就不會把串裡面本來應該有的問號錯誤的替換為空白格。也不會看到討厭的問號,能儲存原來字串的真面目了。
      需要強調的是,替換之前不能進行編碼轉換,一定要繼續使用UTF-8編碼。如果已經轉換成其他編碼,那麼錯誤就已經無法復原轉了。沒有辦法再區分這個錯誤的問號和正常的問號之間的差別了。

Java 解決採集UTF-8網頁空格變成問號亂碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.