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

Android 客戶端解析 JSON 亂碼問題:HttpURLConnection 編碼處理

     編輯:程式設計疑難解答

現象描述

Tomcat 8 默認 UTF-8,返回 JSON 含中文,Android 客戶端使用 HttpURLConnection 獲取輸入流轉字符串後解析,出現亂碼(中文缺失/錯誤)。模擬器與真機表現不一致。

問題代碼片段


InputStream inputStream = conn.getInputStream();
String result = StreamUtils.readFromSteam(inputStream); // 關鍵點
JSONObject jo = new JSONObject(result);

StreamUtils 實現缺陷


public static String readFromSteam(InputStream in) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read()) != -1) { // 錯誤:read() 讀單字節,未用 buffer
        out.write(buffer, 0, len);    // len 為字節值非長度,寫入錯誤數據
    }
    return out.toString(); // 默認平台編碼,非 UTF-8
}

修正方案

1. 正確讀取流並指定編碼


public static String readFromStream(InputStream in, String charset) throws IOException {
    try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset))) {
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        return sb.toString();
    }
}

// 調用
String result = StreamUtils.readFromStream(inputStream, "UTF-8");

2. 設置連接請求頭聲明接受編碼


conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Accept", "application/json; charset=UTF-8");

模擬器與真機差異原因

  • Android 4.4+ 底層網絡棧切換至 OkHttp,HttpURLConnection 實現不同。
  • 部分 ROM 默認編碼非 UTF-8(如 ISO-8859-1),導致 toString() 解碼錯誤。
  • 統一指定編碼 可消除平台差異。

進階建議:使用 OkHttp/Retrofit


// OkHttp 自動處理編碼、連接池、重試
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
    .url("https://10.0.2.2:8080/update.json")
    .build();
try (Response response = client.newCall(request).execute()) {
    String result = response.body().string(); // 已正確解碼
    JSONObject jo = new JSONObject(result);
    // ...
}

現代 Android 開發強烈推薦 OkHttp + Retrofit + Gson/Moshi,避免原生 API 坑點。

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