Tomcat 8 默認 UTF-8,返回 JSON 含中文,Android 客戶端使用 HttpURLConnection 獲取輸入流轉字符串後解析,出現亂碼(中文缺失/錯誤)。模擬器與真機表現不一致。
InputStream inputStream = conn.getInputStream();
String result = StreamUtils.readFromSteam(inputStream); // 關鍵點
JSONObject jo = new JSONObject(result);
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
}
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");
conn.setRequestProperty("Accept-Charset", "UTF-8");
conn.setRequestProperty("Accept", "application/json; charset=UTF-8");
HttpURLConnection 實現不同。toString() 解碼錯誤。
// 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 坑點。