1. 程式人生 > >[轉]UTF-8到GBK轉碼的特殊字元問題

[轉]UTF-8到GBK轉碼的特殊字元問題

Unicode字符集現在有超過10萬個字元,其BMP部分也有六萬多個字元;而GBK字符集只有兩萬以前多個字元。這樣的話,從支援unicode字符集或者unicode字符集BMP的編碼方式,轉化到GBK編碼的時候,就會有編碼落到GBK字符集以外,不能轉化成GBK編碼。在java中,轉換之後的字串,這部分字元都變成了’?’。

通常這些都是非常生僻的字元,倒是可以不考慮;但是有一個特殊的unicode字元,不在GBK字符集中。卻頻繁用於xml/html等格式的檔案中。這個字元unicode序號為0xA0,utf-8編碼結果為C2A0,作用是一個排版空格——普通的ascii空格在xml/html中是被忽略的。大量UTF-編碼的網頁使用這個字元用作佔位的空格。而且似乎瀏覽器對它的處理方式也不同:IE8瀏覽器會認得這個空格,firefox3.6簡單的把它替換成 。當把一個utf-8編碼的網頁轉成gbk編碼時,這個字元就變成討厭的問號了。

處理方法,就是在字串以GBK編碼寫出之前,把這個字元替換掉:

str = str.replace('/u00A0', ' ');

徹底而保險的方法是過濾所有GBK不能表示的字元:

str = str.replaceAll("[^/u4E00-/u9FA5/u3000-/u303F/uFF00-/uFFEF/u0000-/u007F/u201c-/u201d]", " ");