一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

2020-07-17 11:46沉默王二 Java教程

中文亂碼是每個(gè)程序員都會(huì)遇到的問題,本篇文章主要介紹了談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題,具有一定的參考價(jià)值,有興趣的可以了解一下。

如果有哪一個(gè)做程序員的小伙伴說自己沒有遇到中文亂碼問題,我是不愿意相信的。今天在做微信訂閱號的智能回復(fù)時(shí),又一時(shí)迷亂的跳進(jìn)了中文亂碼這個(gè)火坑。剛解決問題時(shí),都?xì)g呼雀躍了,完全忘記了她曾經(jīng)帶給我的痛苦。

一、問題描述

談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

看到?jīng)],紅色框框內(nèi)的亂碼赤裸裸的對我進(jìn)行挑釁,而我卻無可奈何,真是糟糕透頂。

二、尋求解決之道

面對問題,只有拿著刀逼自己去解決啊,能怎么樣呢?

首先,必須搞清楚微信智能回復(fù)的機(jī)制,畫圖如下:

談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

ps,工具用得不好,請見諒。

接下來,我們抓重點(diǎn),看亂碼重要發(fā)生在什么位置。

1.controller返回給用戶

?
1
2
response.setHeader("content-type", "text/html;charset=UTF-8");// 瀏覽器編碼
response.getOutputStream().write(result.getBytes());

就這段代碼了,指定response的編碼方式為UTF-8,按理說亂碼問題應(yīng)該出現(xiàn)好轉(zhuǎn),但是結(jié)果依然是沒有。

2.JAXB的toXML

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public String toXML(Object obj) {
  String result = null;
  try {
    JAXBContext context = JAXBContext.newInstance(obj.getClass());
    Marshaller m = context.createMarshaller();
 
    m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.setProperty(Marshaller.JAXB_FRAGMENT, true);// 去掉報(bào)文頭
 
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    XMLSerializer serializer = getXMLSerializer(os);
 
    m.marshal(obj, serializer.asContentHandler());
 
    result = os.toString("UTF-8");
  } catch (Exception e) {
    e.printStackTrace();
  }
  logger.info("response text:" + result);
  return result;
}
private XMLSerializer getXMLSerializer(OutputStream os) {
  OutputFormat of = new OutputFormat();
  formatCDataTag();
  of.setCDataElements(cdataNode);
  of.setPreserveSpace(true);
  of.setIndenting(true);
  of.setOmitXMLDeclaration(true);
 
  of.setEncoding("UTF-8");
  XMLSerializer serializer = new XMLSerializer(of);
  serializer.setOutputByteStream(os);
  return serializer;
}

這里有三個(gè)關(guān)鍵的點(diǎn):

1. m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

2. getXMLSerializer(os)

3. os.toString("UTF-8");

可以看到以上三個(gè)地方均會(huì)涉及到轉(zhuǎn)碼,第1處,設(shè)置Marshaller的編碼;第二處,設(shè)置整個(gè)XMLSerializer的編碼;第三處,設(shè)置返回的ByteArrayOutputStream的string編碼。三處缺一不可。

這次這么透徹,應(yīng)該解決了問題了吧,但是解決依然中文亂碼,那該如何是好呢?

3.tomcat的輸出環(huán)境作怪

針對這一點(diǎn),網(wǎng)上有人提供這樣的解決思路。

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER% -Dfile.encoding=UTF-8

設(shè)置后重啟tomcat,問題是能夠解決,但副作用是整個(gè)tomcat在服務(wù)器上運(yùn)行輸出(tomcat的cmd窗口)一直是亂碼,我認(rèn)為這種方案不可取。

在運(yùn)行的war中加入以下代碼

?
1
System.getProperty("file.encoding");

你會(huì)驚奇的發(fā)現(xiàn),tomcat的運(yùn)行環(huán)境(window server 2008)竟然是GBK,不知道你是否不驚奇,我是嚇到了,為什么不是UTF-8呢?如果是GBK的話,上面兩個(gè)步驟中我加入再多的UTF-8頁扯淡啊,不解。

三、解決問題

有了以上的經(jīng)驗(yàn),我們修改以下wechat4j的代碼,主要是第二點(diǎn)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public String toXML(Object obj) {
  String result = null;
  try {
    JAXBContext context = JAXBContext.newInstance(obj.getClass());
    Marshaller m = context.createMarshaller();
 
    String encoding = Config.instance().getJaxb_encoding();
    logger.debug("toXML encoding " + encoding + "System file.encoding " + System.getProperty("file.encoding"));
 
    m.setProperty(Marshaller.JAXB_ENCODING, encoding);
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.setProperty(Marshaller.JAXB_FRAGMENT, true);// 去掉報(bào)文頭
 
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    XMLSerializer serializer = getXMLSerializer(os);
 
    m.marshal(obj, serializer.asContentHandler());
 
    result = os.toString(encoding);
  } catch (Exception e) {
    e.printStackTrace();
  }
  logger.info("response text:" + result);
  return result;
}
 
private XMLSerializer getXMLSerializer(OutputStream os) {
  OutputFormat of = new OutputFormat();
  formatCDataTag();
  of.setCDataElements(cdataNode);
  of.setPreserveSpace(true);
  of.setIndenting(true);
  of.setOmitXMLDeclaration(true);
 
  String encoding = Config.instance().getJaxb_encoding();
  of.setEncoding(encoding);
  XMLSerializer serializer = new XMLSerializer(of);
  serializer.setOutputByteStream(os);
  return serializer;
}

這兩個(gè)方法中,對encoding我們加上可配置的編碼方式,可手動(dòng)設(shè)置GBK(我的服務(wù)器上配置了GBK)、GB2312、UTF-8。

如此,會(huì)發(fā)現(xiàn)wechat4j的后臺輸出就不再是中文亂碼了,但返回給用戶的信息更亂了。

談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

怎么能這樣呢,耍我這枚程序員啊,真想吐兩句臟話。但別怕啊,既然wechat4j的logger日志不再中文亂碼,那么只能說是第1個(gè)環(huán)節(jié)又出現(xiàn)問題了。

調(diào)整嘛

?
1
2
response.setHeader("content-type", "text/html;charset=UTF-8");// 瀏覽器編碼
response.getOutputStream().write(result.getBytes("UTF-8"));

注意,這里不能是GBK,只能是UTF-8,我表示不清楚為什么,微信的產(chǎn)品經(jīng)理給出來解釋下。

重點(diǎn),JAXB和response合伙解決wechat4j中文亂碼的 方法再次聲明如下:

WeChatController.Java,就是你配給微信公眾開發(fā)平臺的URL處,response調(diào)整如下

?
1
2
response.setHeader("content-type", "text/html;charset=UTF-8");// 瀏覽器編碼
response.getOutputStream().write(result.getBytes("UTF-8"));

wechat4j的JaxbParser.java,分別調(diào)整toXML(Object obj)和getXMLSerializer(OutputStream os)方法:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public String toXML(Object obj) {
  String result = null;
  try {
    JAXBContext context = JAXBContext.newInstance(obj.getClass());
    Marshaller m = context.createMarshaller();
 
    String encoding = Config.instance().getJaxb_encoding();// GBK
    logger.debug("toXML encoding " + encoding + "System file.encoding " + System.getProperty("file.encoding"));
 
    m.setProperty(Marshaller.JAXB_ENCODING, encoding);
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    m.setProperty(Marshaller.JAXB_FRAGMENT, true);// 去掉報(bào)文頭
 
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    XMLSerializer serializer = getXMLSerializer(os);
 
    m.marshal(obj, serializer.asContentHandler());
 
    result = os.toString(encoding);
  } catch (Exception e) {
    e.printStackTrace();
  }
  logger.info("response text:" + result);
  return result;
}
private XMLSerializer getXMLSerializer(OutputStream os) {
  OutputFormat of = new OutputFormat();
  formatCDataTag();
  of.setCDataElements(cdataNode);
  of.setPreserveSpace(true);
  of.setIndenting(true);
  of.setOmitXMLDeclaration(true);
 
  String encoding = Config.instance().getJaxb_encoding();//GBK
  of.setEncoding(encoding);
  XMLSerializer serializer = new XMLSerializer(of);
  serializer.setOutputByteStream(os);
  return serializer;
}

好了,萬事大吉了。

談?wù)劄镴AXB和response設(shè)置編碼,解決wechat4j中文亂碼的問題

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/qing_gee/article/details/52788962

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: brazzers欧美教师 | 毛片视频网站 | 日韩在线免费看 | 91精品国产综合久 | 日韩高清无砖砖区2022 | 99久久伊人精品波多野结衣 | 成人国产精品 | 奇米影视7777 | 嫩草视频在线观看视频播放 | 亚洲成色www久久网站 | 午夜无码国产理论在线 | 国产成人小视频在线观看 | 精品国产一区二区三区久久久蜜臀 | 99久久精品6在线播放 | 成人夜视频寂寞在线观看 | 无人区在线观看免费完整版免费 | 国产精品酒店视频免费看 | 色姑娘久 | 欧美日韩国产成人综合在线 | 亚洲不卡视频 | 久久人妻熟女中文字幕AV蜜芽 | 美国玩尿眼道videos | 羞羞视频麻豆 | 调教催眠改造np总攻 | 白丝校花好湿好紧 | 人禽l交免费视频观看+视频 | 国产成人精品曰本亚洲78 | 欧美久在线观看在线观看 | 热99精品只有里视频最新 | 国产亚洲精品日韩香蕉网 | 亚洲 欧美 中文字幕 在线 | 好湿好滑好硬好爽好深视频 | 亚洲一区二区日韩欧美gif | 风间由美一区二区av101 | 荷兰艾优apiyoo | 国内亚州视频在线观看 | 四虎影院新网址 | 免费网站看v片在线成人国产系列 | 天天视频官网天天视频在线 | 亚洲性色永久网址 | 人人福利 |