微信訂閱號智能回覆開發中,後台日誌顯示中文正常,但用戶端收到的卻是亂碼(如 游志)。排查發現編碼鏈路斷層:JAXB 生成 XML 時用 UTF-8,但 Tomcat 運行環境 file.encoding=GBK,導致字節流在多次轉碼中錯位。
response.getOutputStream().write(bytes)Marshaller → ByteArrayOutputStream → XMLSerializerm.setProperty(Marshaller.JAXB_ENCODING, encoding); // encoding 可配置為 GBK/UTF-8
OutputFormat of = new OutputFormat(); of.setEncoding(encoding); // 必須與 Marshaller 一致 XMLSerializer serializer = new XMLSerializer(of); serializer.setOutputByteStream(os);
result = os.toString(encoding); // 三處 encoding 必須完全一致
將編碼提取為可配置屬性(如 Config.instance().getJaxb_encoding()),部署時根據服務器環境設置:
file.encoding=GBK → 設置 jaxb_encoding=GBKfile.encoding=UTF-8 → 設置 jaxb_encoding=UTF-8response.setHeader("content-type", "text/html;charset=UTF-8");
response.getOutputStream().write(result.getBytes("UTF-8")); // 強制 UTF-8 輸出給微信服務器
注意:此處必須用 UTF-8,微信服務器只識別 UTF-8,不可用 GBK。
file.encoding?雖可通過 set JAVA_OPTS=-Dfile.encoding=UTF-8 強制修改,但會導致 Tomcat 控制台日誌全變亂碼,運維不可接受。採用代碼層面動態適配,兼容性更強。
修復後:後台日誌中文正常、用戶端收到消息中文正常、微信服務器驗證通過。