網頁

2012年3月22日 星期四

How to convert non-supported charset to html entity in java

前言
這應該是歷史包袱吧,現在一般網頁處理都是使用 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 的檔案就行了。

沒有留言:

張貼留言