A 服務寫入中文 → B 服務數據庫存為亂碼 → B 服務頁面顯示亂碼。雙方數據庫字段、服務編碼均聲稱 UTF-8。
SHOW CREATE TABLE t 確認 CHARSET=utf8mb4。?characterEncoding=utf8&useUnicode=true (MySQL) / ?characterEncoding=UTF-8 (PostgreSQL)。Content-Type: application/json; charset=UTF-8。objectMapper.writeValueAsString 默認 UTF-8,無需額外配置。RestTemplate,確認 StringHttpMessageConverter 默認 UTF-8(Spring Boot 2.2+ 已修正)。@RequestBody 自動解碼,依賴請求頭 charset。@Bean
public Filter characterEncodingFilter() {
CharacterEncodingFilter f = new CharacterEncodingFilter();
f.setEncoding("UTF-8");
f.setForceEncoding(true);
return f;
}<%@ 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))); // 若亂碼這裡能看到錯誤字節模式
對比字節模式,鎖定發生轉碼的環節。