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

J2ME 中文傳輸解決方案:Unicode 編碼與 ISO-8859-1 轉 UTF-8 實作

     編輯:Java 相關知識

問題背景

J2ME (MIDP) 環境下,手機與伺服器之間傳輸中文常因編碼不一致導致亂碼。核心挑戰在於:

  • 手機端支援編碼有限 (多為 Unicode/UTF-16 內部,網路傳輸常用 ISO-8859-1 或 UTF-8)。
  • 伺服器端通常採用 UTF-8 或 GBK/Big5。
  • DataOutputStream/DataInputStream 僅處理位元組流,無編碼感知。

方案一:伺服器 → 客戶端 (Unicode 轉義 \uXXXX)

伺服器端編碼

public static String gbEncoding(String gbString) {
    char[] chars = gbString.toCharArray();
    StringBuilder sb = new StringBuilder();
    for (char c : chars) {
        String hex = Integer.toHexString(c).toUpperCase();
        if (hex.length() <= 2) hex = "00" + hex; // ASCII 前補 00
        sb.append('\\').append('u').append(hex);
    }
    return sb.toString(); // 例: "中文" → "\u4E2D\u6587"
}

傳輸前先將字串轉為 \uXXXX 形式,再以 getBytes() (平台預設編碼) 或指定 ISO-8859-1 發送。

客戶端解碼

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

方案二:客戶端 → 伺服器 (ISO-8859-1 轉 UTF-8)

客戶端發送

byte[] data = value.getBytes("ISO8859_1"); // MIDP 必支援
out.writeInt(data.length);
out.write(data);

伺服器端接收轉碼

public static String isoToUtf(String iso) {
    if (iso == null) return "";
    try {
        return new String(iso.getBytes("ISO-8859-1"), "UTF-8");
    } catch (UnsupportedEncodingException e) {
        return iso; // 回退
    }
}

原理:String.getBytes("ISO-8859-1") 將 Java 內部 char[] (UTF-16) 還原為原始位元組陣列,再以 UTF-8 重新解碼為正確字串。

實務建議與替代方案

  • 優先使用 UTF-8 直傳:若手機支援 value.getBytes("UTF-8") 且伺服器同樣以 UTF-8 解碼,最簡單可靠。
  • JSON + Base64:將中文 Base64 編碼後放入 JSON,雙端統一處理,避免編碼協商。
  • 資料庫層面:資料庫字符集設為 UTF-8 (MySQL: utf8mb4,Oracle: AL32UTF8),JDBC URL 加 characterEncoding=UTF-8。
  • 測試矩陣:務必在目標機型 (Nokia, Sony Ericsson, Motorola 等) 實測,編碼支援度差異極大。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved