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

Java 跨服務中文亂碼:統一編碼鏈路排查清單

     編輯:程式設計綜合問答

現象

A 服務寫入中文 → B 服務數據庫存為亂碼 → B 服務頁面顯示亂碼。雙方數據庫字段、服務編碼均聲稱 UTF-8。

編碼鏈路完整檢查

  1. 數據庫:
    — 表字符集:SHOW CREATE TABLE t 確認 CHARSET=utf8mb4。
    — 連接字符集:JDBC URL ?characterEncoding=utf8&useUnicode=true (MySQL) / ?characterEncoding=UTF-8 (PostgreSQL)。
  2. A 服務發送:
    — HTTP 請求頭:Content-Type: application/json; charset=UTF-8。
    — 序列化:Jackson objectMapper.writeValueAsString 默認 UTF-8,無需額外配置。
    — 若用 RestTemplate,確認 StringHttpMessageConverter 默認 UTF-8(Spring Boot 2.2+ 已修正)。
  3. 網絡傳輸:
    — 抓包 (Wireshark/Fiddler) 確認請求體實際字節是否為 UTF-8 編碼的中文。
  4. B 服務接收:
    — @RequestBody 自動解碼,依賴請求頭 charset。
    — 若無 charset,Tomcat 默認 ISO-8859-1 → 亂碼。
    — 全局過濾器強制:
    @Bean
    public Filter characterEncodingFilter() {
        CharacterEncodingFilter f = new CharacterEncodingFilter();
        f.setEncoding("UTF-8");
        f.setForceEncoding(true);
        return f;
    }
  5. B 服務寫入 DB:同第 1 條,確認連接字符集。
  6. B 服務頁面輸出:
    — JSP/Thymeleaf/Freemarker 頁面頭部 <%@ page contentType="text/html;charset=UTF-8" %> / <meta charset="UTF-8">。
    — 響應頭 Content-Type: text/html; charset=UTF-8。

快速定位法

在 A/B 服務關鍵節點打印原始字節:

// A 發送前
log.info("Send bytes: {}", Arrays.toString(json.getBytes(StandardCharsets.UTF_8)));

// B 接收後
log.info("Received bytes: {}", Arrays.toString(requestBody.getBytes(StandardCharsets.ISO_8859_1))); // 若亂碼這裡能看到錯誤字節模式

對比字節模式,鎖定發生轉碼的環節。

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