首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 瀏覽器開發:HTML Unicode 實體編碼轉換核心算法實現

     編輯:J2ME

問題背景

開發 J2ME 瀏覽器時,HTML 內容常包含 Unicode 實體編碼(如 中、中),必須解碼為對應字元才能正確顯示。例如:

<a href="https://wap.monternet.com/">返回移動夢網</a><br/>

若原始碼含 &#22823;&#x5C0F;,需轉為「大小」兩字。

核心解碼算法:decodeUnicode(String dataStr)


private static String decodeUnicode(final String dataStr) {
    int start = 0, end = 0;
    final StringBuffer buffer = new StringBuffer();

    while (start > -1) {
        int system = 10; // 預設十進制
        if (start == 0) {
            int t = dataStr.indexOf("&#");
            if (start != t) start = t;
        }
        end = dataStr.indexOf(";", start + 2);
        String charStr = "";
        if (end != -1) {
            charStr = dataStr.substring(start + 2, end);
            // 判斷進制:十六進制以 x/X 開頭
            char s = charStr.charAt(0);
            if (s == 'x' || s == 'X') {
                system = 16;
                charStr = charStr.substring(1);
            }
        }
        // 轉換
        try {
            char letter = (char) Integer.parseInt(charStr, system);
            buffer.append(new Character(letter).toString());
        } catch (NumberFormatException e) {
            e.printStackTrace();
        }
        // 處理當前實體到下一實體間的普通字元
        start = dataStr.indexOf("&#", end);
        if (start - end > 1) {
            buffer.append(dataStr.substring(end + 1, start));
        }
        // 處理尾部普通字元
        if (start == -1) {
            int length = dataStr.length();
            if (end + 1 != length) {
                buffer.append(dataStr.substring(end + 1, length));
            }
        }
    }
    return buffer.toString();
}

算法關鍵點解析

  1. 雙指針掃描:start 定位 &#,end 定位結束分號 ;。
  2. 進制自動識別:檢查數字首字元是否為 x/X,決定 parseInt 基數(10 或 16)。
  3. 非實體字元保留:實體之間、尾部的普通字元直接 append,確保輸出完整。
  4. 異常防護:NumberFormatException 捕獲避免單一錯誤實體導致全量解析失敗。

效能與記憶體考量(J2ME 專屬)

  • 使用 StringBuffer 而非 String 連接,避免大量臨時物件。
  • 單次掃描線性時間 O(n),無巢狀迴圈。
  • 避免正則表達式(CLDC 無 java.util.regex),純索引操作極輕量。

擴展建議

  • 支援命名實體(&nbsp;、&copy; 等)需額外查表映射。
  • 整合至 InputStream 過濾器,實現串流式解碼,降低峰值記憶體。
  • 針對大量文本可分塊處理,避免單次分配過大 StringBuffer。

結語

此解碼器以最小代碼體積解決 J2ME 瀏覽器的 Unicode 實體顯示難題,算法清晰、無第三方依賴、適配 CLDC 1.1+ 環境,可直接整合至任何基於 MIDP 的瀏覽器或富文本渲染引擎中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved