前言
這應該是歷史包袱吧,現在一般網頁處理都是使用 utf-8 ,以前都是用 big5,而且許多營運已久的資料庫也是使用 big5 編碼,那就更不可能砍掉重練,轉碼變成是無法避免的課題。
Covert non-supported charset to html entity
    • 以前遇到罕用字,不是用兩個字拼起來,就是直接給個空白或問號吧。那要如何將 Big5字集外的字元寫入資料庫中,最直接的方式就是轉碼成 Html Entity ,即 &#xxxxx;格式,再跟原字串合併儲存至資料庫。例如"天靝",靝不在 big5 字集的範圍內,就把它轉成 靝 的格式。
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;

public class NonSupportedCharsetToHtmlEntity {
public static String convertHtml(String str) {
StringBuilder buf = new StringBuilder(str.length());
CharsetEncoder encode = Charset.forName("Big5").newEncoder();

for (int idx=0; idx<str.length(); idx++) {
char ch = str.charAt(idx);
if (encode.canEncode(ch)) {
buf.append(ch);
} else {
buf.append("&#").append((int)ch).append(';');
}
}

return buf.toString();
}

public static void main(String[] args) {
String str = "天靝\u975D";
String result = convrtHtml(str);
System.out.println(result);
}
}
    • Output:
天&#38749;&#38749;


  • 可能遇到的問題
      • warning: unmappable character for encoding MS950
        • 編譯時,如果沒指定編碼,預設會使用 OS 編碼。在編譯時,指定編碼即可。
javac -encoding "UTF-8" NonSupportedCharsetToHtmlEntity.java

    • error: class, interface, or enum expected
      • 此為檔案在儲存成 utf-8 編碼時,在檔頭加入了 BOM(ef bb bf),造成編譯時出錯,只要將檔案另存成檔首無 BOM 的檔案就行了。

mark528 發表在 痞客邦 PIXNET 留言(0) 人氣()