J2ME (MIDP) 環境下,手機與伺服器之間傳輸中文常因編碼不一致導致亂碼。核心挑戰在於:
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();
}
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 重新解碼為正確字串。
value.getBytes("UTF-8") 且伺服器同樣以 UTF-8 解碼,最簡單可靠。utf8mb4,Oracle: AL32UTF8),JDBC URL 加 characterEncoding=UTF-8。