1. 程式人生 > >java處理html空格變成問號問題

java處理html空格變成問號問題

昨天發現,用 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處理html空格變成問號問題

昨天發現,用 HtmlDecode() 去解碼後,“ ”不是被解碼為半形的空格(ASCII碼0x20)而是變成半形問號“?”(ASCII碼0x3F)。而且奇怪的是,只有每行前面的空格才會出問題,如果前面後面有漢字的話,空格就還是空格。但是更加奇怪的是,如果

JAVA處理html標籤

package com.nfa; import java.util.regex.Matcher; import java.util.regex.Pattern; public class UtilHtml { /*刪除所有HTML標籤,返回純文字*/ publi

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

昨天發現,用 HtmlDecode() 去解碼後,“ ”不是被解碼為半形的空格(ASCII碼0x20)而是變成半形問號“?”(ASCII碼0x3F)。而且奇怪的是,只有每行前面的空格才會出問題,如果前面後面有漢字的話,空格就還是空格。但是更加奇怪的是,如果

java 使用jsoup處理html字符

att nbsp 遍歷 src class clas element pen 上班 依賴的jar <dependency> <groupId>org.jsoup</groupId> <

《資料庫技巧》java對資料庫新增資料後,中文字元變成問號

資料庫:mysql 開發工具:eclipse 遇到的問題:編寫對mysql資料庫的新增語句,然後執行專案後,發現所有的中文內容,在資料庫中均顯示成問號 上述程式碼是向資料庫新增資料的程式碼,執行完畢後,開啟資料庫的顯示如下: 發生這

Java時間處理類 SimpleDateFormat物件的parse方法處理12點變成00點

SimpleDateFormat是個用得很高頻率的時間處理類 該物件的倆個主要方法: parse方法:將字串型別(java.lang.String)解析為日期型別(java.util.Date)

【mysql】mysql插入中文資料變成問號怎麼處理

插入中文資料變成問號,一般都是因為字符集沒有設定成utf8的原因 1、修改字符集: ALTER TABLE 表名 MODIFY 列名 型別(50) CHARACTER SET "utf8"; 如:ALTER TABLE t_student MODIFY stuName

Java插入中文到資料庫中文變成問號???解決辦法

在url後面新增引數:url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8 DriverManager.getConnection("jdbc:mysql://localhost:3306/

java註釋中空格和換行符的處理

java 註釋換行寫成<P/>或<BR/> 空格寫成&nbsp; 如: /**      * 彈出操作確認對話方塊,彈出的確認框分為上下兩部分,上面是一串提示文字,下面有左右兩個操作按鈕 <BR/>      *  ------

java插入mysql亂碼(變成問號

java後臺操作插入mysql的之前的數值時正常的,但是插入以後再mysql中確是亂碼 在mysql中查詢所有字符集 SHOW VARIABLES LIKE 'character_set_%'; 查詢出來所有的字符集 character_set_clientutf8mb4

Linux下java程式碼log4j日誌輸出中文出現亂碼,中文全部變成問號,解決辦法

問題描述: (1)log4j.xml和log4j.properties日誌輸出的編碼格式正常都設定為UTF-8 (2)cat命令獲取txt檔案,裡面的中文可以正常顯示 (3)log.***(info)中文全部出現亂碼 原因: linux本地設定的檔案編碼格式不是UT

Java插入中文到資料庫中文變成問號解決

之所以會出現亂碼,就是編碼方式不一致導致的 我們應該首先確定          1. eclipse和mysql資料庫中的編碼方式是否一致          2. 在連結資料時,有沒有在url裡面加上characterEncoding=utf8,也就是下圖這樣    

JAVA遇見HTML——JSP篇

nbsp jsp 合規 html 完成 bsp 構造 構造方法 重定向 請求重定向 請求轉發 重定向 頁面的路徑變化 不是一個請求完成 都是在服務器完成 session 客戶端與服務器 的一次會話時間 Javabean 符合規則的java類 實體類 公有類 無參

java處理圖片--圖片的縮放,旋轉和馬賽克化

add 大小 count fun ref translate markdown 文件 new 這是我自己結合網上的一些資料封裝的java圖片處理類,支持圖片的縮放,旋轉,馬賽克化。(轉載請註明出處:http://blog.csdn.net/u012116

BeanShell Processor_使用Java處理腳本

processor for cond integer style var import mpm ava 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 【try-catch】 建議使用Try----Catch塊,這樣Java語句出現問題時,日誌更清晰; try

Java解析html頁面,獲取想要的元素

parse tails src www 標準 pro 1.8 com 9.png 背景:通過接口訪問數據,獲取的內容是個標準的html格式,使用jsoup的方式獲取頁面元素值 先推薦比較好的博客:http://www.open-open.com/jsoup/、 單個案例比較

word中如何將空格變成換行

結果 工具 步驟 -1 查找 inline com photo index 大家在工作和學習中可能會遇到文字替換或符號替換,大家要學會txt、doc、xls之間的切換,替換好之後放到最終的文件中,txt好處是沒有格式,doc個好處是有格式,而xls主要是分配到單元格中。

the first day -java遇見html---servlet

傳遞 etc 簡單 ava spa 字符串 eclipse 創建 字符 ①手動創建servlet 第一步創建一個servlet類,並繼承httpservlet public class HelloServlet extends HttpServlet 第二步重寫doget或

淺析PHP中處理HTML特殊字符轉換

order charset body special 前臺 regular 混亂 base ble 我們在用PHP處理頁面顯示內容時,經常會遇到一些特殊字符轉換問題,如果處理不當就會導致頁面顯示混亂,不能得到目標效果。所以本文我們將和大家一起歸納總結PHP中處理HTML特殊

JAVA傳遞帶有空格的參數

oid string public system class sys bsp pro space 1 String s="b2 + b1"; 2 Process child = Runtime.getRuntime().exec("C:\\eclipse-work