開發 J2ME 瀏覽器時,HTML 內容常包含 Unicode 實體編碼(如 中、中),必須解碼為對應字元才能正確顯示。例如:
<a href="https://wap.monternet.com/">返回移動夢網</a><br/>
若原始碼含 大小,需轉為「大小」兩字。
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();
}
start 定位 &#,end 定位結束分號 ;。x/X,決定 parseInt 基數(10 或 16)。append,確保輸出完整。NumberFormatException 捕獲避免單一錯誤實體導致全量解析失敗。StringBuffer 而非 String 連接,避免大量臨時物件。java.util.regex),純索引操作極輕量。 、© 等)需額外查表映射。InputStream 過濾器,實現串流式解碼,降低峰值記憶體。StringBuffer。此解碼器以最小代碼體積解決 J2ME 瀏覽器的 Unicode 實體顯示難題,算法清晰、無第三方依賴、適配 CLDC 1.1+ 環境,可直接整合至任何基於 MIDP 的瀏覽器或富文本渲染引擎中。