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

J2ME 中文傳輸編碼解決方案:服務端與客戶端雙向兼容實踐

     編輯:J2ME

場景痛點

早期 J2ME 手機對字符編碼支援不一,網絡傳輸中文易亂碼。本文提供一套「服務端→客戶端 Unicode 轉義」+「客戶端→服務端 ISO-8859-1 透傳」的雙向兼容方案。

一、服務端 → 客戶端:Unicode \uXXXX 轉義

1.1 服務端編碼邏輯

public static String gbEncoding(String gbString) {
    char[] chars = gbString.toCharArray();
    StringBuilder unicodeBytes = new StringBuilder();
    for (char c : chars) {
        String hex = Integer.toHexString(c);
        if (hex.length() <= 2) hex = "00" + hex; // ASCII 補齊 4 位
        unicodeBytes.append("\\u").append(hex);
    }
    return unicodeBytes.toString(); // 如:"中文" → "\u4e2d\u6587"
}

// 發送流程
String unicode = gbEncoding(value);
byte[] data = unicode.getBytes(); // 按平台默認編碼(通常 ISO-8859-1/UTF-8)轉字節
out.writeInt(data.length);
out.write(data);

1.2 客戶端解碼邏輯

private StringBuffer decodeUnicode(String dataStr) {
    StringBuffer buffer = new StringBuffer();
    int start = 0, end = 0;
    while (start > -1) {
        end = dataStr.indexOf("\\u", start + 2);
        String charStr = (end == -1) ? 
            dataStr.substring(start + 2) : 
            dataStr.substring(start + 2, end);
        char letter = (char) Integer.parseInt(charStr, 16);
        buffer.append(letter);
        start = end;
    }
    return buffer;
}

二、客戶端 → 服務端:ISO-8859-1 透傳 + 服務端轉 UTF-8

2.1 客戶端發送

private void writeSjis(DataOutputStream out, String value) {
    // 關鍵:按 ISO-8859-1 獲取字節,不做任何轉換
    byte[] data = value.getBytes("ISO8859_1"); 
    out.writeInt(data.length);
    out.write(data);
}

原理:J2ME 字符內部為 Unicode,getBytes("ISO8859_1") 將低 8 位直接取出(高 8 位截斷),對於中文(BMP 字符)實際上丟失高位信息,但配合服務端反向還原可工作。

2.2 服務端還原為 UTF-8

public static String isoToUtf(String iso) {
    if (iso == null) return "";
    try {
        // 將 ISO-8859-1 字節重新解碼為 UTF-8 字符串
        return new String(iso.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return iso;
    }
}

後續業務邏輯、數據庫存儲均基於 UTF-8。注意:SQL Server 等數據庫可能需額外按其內碼轉換。

三、方案評價與適用場景

維度評價
通用性只要手機支援 Unicode/GB2312 顯示即可工作
效率非最高效(字符串膨脹、雙向轉換開銷),但可接受
可靠性實測主流機型通過,避開了編碼支援差異陷阱
適用場景早期 J2ME 專案、不支援 HTTPS/現代編碼協商的環境

現代替代建議

  • 採用 UTF-8 端到端傳輸(需確認手機支援 getBytes("UTF-8"))
  • 使用 DataOutputStream.writeUTF/readUTF(Modified UTF-8 格式)
  • 應用層協議協商編碼(如 HTTP Header Content-Type: application/json; charset=utf-8)

本方案作為歷史遺留項目維護或極度受限環境下的實用備選。

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