首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

徹底解決 wechat4j 中文亂碼:JAXB 編碼與 Response 編碼雙重配置實戰

     編輯:Java 相關知識

問題現場

微信訂閱號智能回覆開發中,後台日誌顯示中文正常,但用戶端收到的卻是亂碼(如 游志)。排查發現編碼鏈路斷層:JAXB 生成 XML 時用 UTF-8,但 Tomcat 運行環境 file.encoding=GBK,導致字節流在多次轉碼中錯位。

核心鏈路拆解

  1. Controller → response.getOutputStream().write(bytes)
  2. JAXB Marshaller → ByteArrayOutputStream → XMLSerializer
  3. Tomcat 運行環境默認編碼(Windows Server 2008 為 GBK)

關鍵修復點(三處必須一致)

1. JAXB Marshaller 編碼

m.setProperty(Marshaller.JAXB_ENCODING, encoding);  // encoding 可配置為 GBK/UTF-8

2. XMLSerializer 輸出編碼

OutputFormat of = new OutputFormat();
of.setEncoding(encoding);  // 必須與 Marshaller 一致
XMLSerializer serializer = new XMLSerializer(of);
serializer.setOutputByteStream(os);

3. ByteArrayOutputStream 轉字符串編碼

result = os.toString(encoding);  // 三處 encoding 必須完全一致

動態配置方案

將編碼提取為可配置屬性(如 Config.instance().getJaxb_encoding()),部署時根據服務器環境設置:

  • 服務器 file.encoding=GBK → 設置 jaxb_encoding=GBK
  • 服務器 file.encoding=UTF-8 → 設置 jaxb_encoding=UTF-8

Response 輸出層修復

response.setHeader("content-type", "text/html;charset=UTF-8");
response.getOutputStream().write(result.getBytes("UTF-8"));  // 強制 UTF-8 輸出給微信服務器

注意:此處必須用 UTF-8,微信服務器只識別 UTF-8,不可用 GBK。

為什麼不直接改 Tomcat file.encoding?

雖可通過 set JAVA_OPTS=-Dfile.encoding=UTF-8 強制修改,但會導致 Tomcat 控制台日誌全變亂碼,運維不可接受。採用代碼層面動態適配,兼容性更強。

最終效果驗證

修復後:後台日誌中文正常、用戶端收到消息中文正常、微信服務器驗證通過。

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