UTF-8轉GBK的悲劇:特殊字元C2A0
阿新 • • 發佈:2019-02-10
這個問題出現得比較早:在傳給印象派的作品描述XML(GBK編碼)中一些文字資訊經常包含亂碼,而且會一亂到底,甚至導致不同頁的錯亂。剛開始一直都沒有什麼頭緒,不過後來終於發現了部分頭緒:GBK的字符集過小,對一些特殊字元的轉碼會出現亂碼—-一些生僻字也就算了,但是其中卻包括這個字元:C2A0—-一個在網頁上經常使用排版用全形空格。就是這麼個字元,使用者從網頁端拷貝了一段文字,複製到介面上顯示正常,儲存到作品XML檔案中(UTF8編碼),顯示正常。但是上傳作品時由於將相應的XML編碼格式轉換成GBK,於是出現了亂碼……
處理方法:
方法一:轉換時對文字資訊做特殊處理,用0×20代替掉0xC2A0。
方法二:作品XML檔案直接以UTF8編碼傳輸。
處理方法:
方法一:轉換時對文字資訊做特殊處理,用0×20代替掉0xC2A0。
方法二:作品XML檔案直接以UTF8編碼傳輸。
方法一有點頭疼治頭腳疼治腳的味道,雖然解決了這個問題,但是總歸不夠規範不夠完美—-很多頁面都是這麼做。而方法二則需要伺服器支援,但可以完美的解決這個問題。以前伺服器之所以用GBK編碼很大的理由可能在於GBK相對UTF8更省空間—-在這麼個硬碟空間足夠,頻寬足夠的現狀下,節約出來的那麼點東西又有什麼用呢?
/** * * 將不換行空格(NO-BREAK SPACE,Unicode 0x00a0,UTF-8編碼:0xC2A0)替換為普通空格。 * * 用於避免因資料庫字符集不相容導致這個字元變為問號“?”的情況。 */ public static String nobreakSpaceToSpace(String str) { if (str == null) { return null; } char nbsp = 0x00a0; return str.replace(nbsp, ' '); }