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

Android Studio Run 輸出亂碼問題:JSON 數據源頭編碼排查指南

     編輯:程式設計疑難解答

問題現象

  • Android Studio Run 窗口 `System.out.println` 輸出個別字符亂碼
  • 設置控制台字體/編碼無效
  • 懷疑服務端返回數據編碼問題

核心判斷邏輯

關鍵問題:亂碼是「顯示層」問題還是「數據層」問題?

快速驗證步驟

  1. 瀏覽器直接訪問 API:`chrome://net-internals` 或 Postman 查看原始響應
  2. 檢查響應 Headers:`Content-Type: application/json; charset=utf-8`
  3. 保存響應為文件:用 Notepad++/VS Code 打開檢查編碼

常見原因與解決

1. 服務端返回非 UTF-8 編碼(最常見)

# 服務端響應頭缺少 charset 或編碼不匹配
Content-Type: application/json  # 缺少 charset
# 或
Content-Type: application/json; charset=GBK  # 中文環境常見

解決:服務端統一設置 `Content-Type: application/json; charset=utf-8`

2. OkHttp/Retrofit 未正確解碼

// OkHttp 默認根據 Content-Type charset 解碼,缺失時按 UTF-8
// 強制指定編碼
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(jsonString, JSON);

// 或自定義 Converter
class GsonResponseBodyConverter implements Converter {
    public T convert(ResponseBody value) {
        String json = value.string();  // 內部已按 charset 解碼
        return new Gson().fromJson(json, type);
    }
}

3. Android Studio 控制台編碼設置

  • File → Settings → Editor → File Encodings → Global Encoding: UTF-8
  • Settings → Editor → General → Console → Default encoding: UTF-8
  • Help → Edit Custom VM Options 添加:`-Dfile.encoding=UTF-8`

4. 文件編碼與編譯不一致

// build.gradle
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}
// 或
compileOptions.encoding = "UTF-8"

調試技巧:定位亂碼源頭

// 1. 打印原始字節
byte[] rawBytes = responseBody.bytes();
Log.d("RAW", Arrays.toString(rawBytes));

// 2. 打印十六進制
String hex = bytesToHex(rawBytes);
Log.d("HEX", hex);

// 3. 嘗試不同編碼解碼
String utf8 = new String(rawBytes, StandardCharsets.UTF_8);
String gbk = new String(rawBytes, "GBK");
Log.d("UTF8", utf8);
Log.d("GBK", gbk);

最佳實踐檢查清單

  1. ✅ 服務端響應頭強制 `charset=utf-8`
  2. ✅ 客戶端網絡庫正確解析 charset
  3. ✅ 源碼文件保存為 UTF-8 (BOM-less)
  4. ✅ Gradle 編譯編碼設置 UTF-8
  5. ✅ AS 控制台/日誌編碼設置 UTF-8
  6. ✅ 數據庫連接字符串 `characterEncoding=utf8`

結論:90% 情況下「個別字符亂碼」源於服務端響應編碼聲明缺失或不匹配。優先用瀏覽器/Postman 驗證原始響應,而非在 IDE 控制台猜測。

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