プログラマーの友人が、中国の文字化けコードの問題に遭遇していなかったと言ったら、私はそれを信じたくありません。今日、WeChatサブスクリプションアカウントに賢明な返信をしていたとき、私は混乱した方法で中国の文字化けコードのファイアピットに飛び込みました。私が最初に問題を解決したとき、私は歓声を上げ、彼女がかつて私にもたらした痛みを完全に忘れました。
1。問題の説明
それを見て、赤いフレームの文字化けのコードは私を否定していましたが、私は無力でした。とても悪かった。
2。解決策を探します
問題に直面したとき、あなたは自分自身をナイフで解決するように強制することができます。何ができますか?
まず第一に、WeChatインテリジェントな応答のメカニズムを理解し、次のように絵を描く必要があります。
PS、ツールをうまく使用していないことをお詫びします。
次に、重要なポイントに焦点を当て、文字化けコードがどこに重要かを見てみましょう。
1.コントローラーはユーザーに戻ります
Response.setheader( "content-type"、 "text/html; charset = utf-8"); // browser encoding respons.getOutputStream()。write(result.getBytes());
このコードだけで、応答を指定するエンコーディング方法はUTF-8です。文字化けした問題が改善されたはずですが、結果はまだそうではありません。
2.JAXBのTOXML
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); //メッセージヘッダー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( "応答テキスト:" + 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;}ここに3つの重要なポイントがあります。
1。M.SetProperty(marshaller.jaxb_encoding、 "utf-8");
2。GetXmlSerializer(OS)
3。OS.TOSTRING( "UTF-8");
上記の3つの場所にはトランスコーディングが含まれていることがわかります。そもそも、マーシャラーのエンコードを設定します。 2番目に、XMLSerializerエンコード全体を設定します。 3位では、返されたbytearrayoutputStreamの文字列エンコードを設定します。 3つすべてが不可欠です。
今回は、問題を解決するはずですが、解決策はまだ中国語の文字化けにあります。それで、私は何をすべきですか?
3. Tomcatの出力環境は間違っています
この点に応じて、誰かがオンラインでそのような解決策を提供します。
set java_opts =%java_opts%logging_manager%-dfile.encoding = utf -8
Tomcatを再起動した後、問題は解決できることですが、副作用はTomcat全体がサーバー上の出力(TomcatのCMDウィンドウ)を実行していることです。
次のコードを実行中の戦争に追加します
System.GetProperty( "file.Encoding");
Tomcatの実行環境(Window Server 2008)がGBKであることが判明したことに驚くでしょう。あなたが驚かないのだろうか。私は怖かったのですが、なぜUTF-8ではないのですか? GBKの場合、上記の2つのステップにUTF-8ページを追加しますが、わかりません。
3。問題を解決します
上記のエクスペリエンスにより、主に2番目のポイントであるWECHAT4Jコードを変更します。
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、エンコーディング); M.SetProperty(marshaller.jaxb_formatted_output、true); M.SetProperty(marshaller.jaxb_fragment、true); //メッセージヘッダーbytearrayoutputStream os = new bytearrayoutputStream(); XMLSERIALIZER SERIALIZER = GETXMLSERIALIZER(OS); M.Marshal(obj、serializer.ascontenthandler()); result = os.toString(エンコード); } catch(Exception e){e.printstacktrace(); } logger.info( "応答テキスト:" + 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(エンコーディング); XmlSerializer Serializer = new XmlSerializer(of); Serializer.setOutputByTestream(OS); return serializer;}これら2つの方法の中で、構成可能なエンコードメソッドを追加して、GBK(GBKがサーバーで構成されている)、GB2312、およびUTF-8を自動的に設定します。
このようにして、wechat4jのバックグラウンド出力は中国語の文字化けではなくなっていることがわかりますが、ユーザーに返された情報はさらに厄介です。
これはどのようにできますか?私はプログラマーであり、本当にいくつかの言葉を誓いたいと思っています。しかし、恐れないでください。 WeChat4Jのロガーログは中国語ではなくなっていないため、最初の段階に別の問題があると言えば言えます。
調整する
Response.setheader( "content-type"、 "text/html; charset = utf-8"); // browser encoding respons.getOutputStream()。write(result.getBytes( "utf-8"));
これはGBKではないことに注意してください。UTF-8のみであることができます。 Wechatのプロダクトマネージャーが説明した理由はわからないと言いました。
重要なポイントは、 JaxBとResponseが共同でWeChat4J中国の文字化けコードを次のように宣言することです。
wechatcontroller.javaは、WeChat Public Developmentプラットフォームに割り当てたURLです。応答は次のように調整されます
Response.setheader( "content-type"、 "text/html; charset = utf-8"); // browser encoding respons.getOutputStream()。write(result.getBytes( "utf-8"));
wechat4jのjaxbparser.java、それぞれtoxml(Object obj)とgetXmlserializer(outputStream OS)メソッドを調整します。
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、エンコーディング); M.SetProperty(marshaller.jaxb_formatted_output、true); M.SetProperty(marshaller.jaxb_fragment、true); //メッセージヘッダーbytearrayoutputStream os = new bytearrayoutputStream(); XMLSERIALIZER SERIALIZER = GETXMLSERIALIZER(OS); M.Marshal(obj、serializer.ascontenthandler()); result = os.toString(エンコード); } catch(Exception e){e.printstacktrace(); } logger.info( "応答テキスト:" + 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;}わかりました、すべてが順調に進んでいます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。