昨天發現,用 htmldecode() 去解碼後,「 」不是被解碼為半形的空格(ascii碼0x20)而是變成半形問號「?」(ascii碼0x3f)。而且奇怪的是,只有每行前面的空格才會出問題,如果前面後面有漢字的話,空格就還是空格。但是更加奇怪的是,如果直接在htmldecode()的後面直接加上trim()的話,這個問號會被去掉。而正常的情況下,問號是不會被去掉的,只有空格才會被去掉。
發生這個問題的時候,我是在把解碼後的內容寫入資料庫,因此一直都以為是sqlserver與應用程式之間的字符集問題或者編碼方式問題。搞了n久,最後才發現在送進sqlserver之前,內容就已經是問號了。
查了很久,也找不到這個問題如何解決。因此,只能使用山寨解決方法了:
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;
string utfspace = encoding.getencoding("utf-8").getstring(space);
htmlstr = htmlstr.replace(utfspace," ");
這樣做,就不會把串裡面本來應該有的問號錯誤的替換為空格。也不會看到討厭的問號,能儲存原來字串的真面目了。
需要強調的是,替換之前不能進行編碼轉換,一定要繼續使用utf-8編碼。如果已經轉換成其他編碼,那麼錯誤就已經不可逆轉了。沒有辦法再區分這個錯誤的問號和正常的問號之間的差別了。
mysql 空格顯示問號 空格變成問號
全形空格匯入資料庫後變成問號,是因為插入的字元的型別和字段的型別不匹配造成的。1.可以修改字段型別text改為ntext。2.在插入資料庫之前進行轉換 byte space new byte string utfspace encoding.getencoding utf 8 getstring s...
Cookie存入空格變成加號問題
搜尋條件存入cookie中,下次回顯空格變成 號 例如 輸入內容a b 下次進來變成a b 思路一 存入cookie時出現了問題 一般的解決辦法encodeuricomponent加碼,然後decodeuricomponent解碼。加碼後 title 3da 2b 252bb 解碼後 title a...
web中文變成問號問題解決
在排除了基本可能出現亂碼的其他問題後 如果網頁上的編碼還是亂碼 看看是不是response響應編碼的問題 printwriter getwriter 獲得字元流,通過字元流的 write string s 方法可以將字串設定到 response 緩衝區中,隨後 tomcat 會將 response ...