إذا قال أي صديق مبرمج إنه لم يواجه مشكلة الكود المشتعل الصيني ، فلن أرغب في تصديق ذلك. اليوم ، عندما كنت أقوم بالرد الذكي على حساب الاشتراك في WeChat ، قفزت إلى حفرة النار من الكود المشوهة الصيني بطريقة مشوشة. عندما حللت المشكلة لأول مرة ، هتفت ونسيت تمامًا الألم الذي جلبته لي مرة واحدة.
1. وصف المشكلة
عند رؤية ذلك ، كانت الرموز المشوهة في الإطار الأحمر تستفزني بشكل غير عاجز. كان سيئا للغاية.
2. ابحث عن حل
عند مواجهة مشكلة ، يمكنك فقط إجبار نفسك على حلها بسكين. ماذا يمكنك أن تفعل؟
بادئ ذي بدء ، يجب أن نفهم آلية الرد الذكي WeChat ، ونرسم الصورة على النحو التالي:
ملاحظة ، يرجى الاعتذار عن عدم استخدام الأدوات بشكل جيد.
بعد ذلك ، دعونا نركز على النقاط الرئيسية ومعرفة أين هو الرمز المشتعلة مهمًا.
1. وحدة التحكم تعود إلى المستخدم
استجابة.
هذا الرمز فقط ، طريقة الترميز لتحديد الاستجابة هي UTF-8. من المنطقي أن تكون المشكلة المشوهة قد تحسنت ، لكن النتيجة لا تزال غير.
2. Jaxb's Toxml
السلسلة العامة toxml (Object OBJ) {String result = null ؛ حاول {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 = جديد bytearrayoutputstream () ؛ xmlserializer serializer = getxmlserializer (OS) ؛ M.Marshal (OBJ ، Serializer.ascontentHandler ()) ؛ النتيجة = OS.ToString ("UTF-8") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } logger.info ("نص الاستجابة:" + نتيجة) ؛ نتيجة الإرجاع ؛} xmlserializer private getxmlserializer (OutputStream OS) {outputFormat of = new OutputFormat () ؛ formatcdatatag () ؛ of.setcdataelements (cdatanode) ؛ of.SetPreservespace (true) ؛ of.SetIndenting (صواب) ؛ of.setomitxmldEclaration (true) ؛ of.setEncoding ("UTF-8") ؛ xmlserializer serializer = xmlserializer جديد (من) ؛ serializer.setOutputByTerem (OS) ؛ عودة مسلسل ؛} فيما يلي ثلاث نقاط رئيسية:
1. M.SetProperty (Marshaller.jaxb_encoding ، "UTF-8") ؛
2. getxmlserializer (OS)
3. OS.ToString ("UTF-8") ؛
يمكنك أن ترى أن الأماكن الثلاثة المذكورة أعلاه تنطوي على ترميز. في المقام الأول ، قم بتعيين ترميز مارشالر ؛ في المقام الثاني ، قم بتعيين تشفير XMLSerializer بالكامل ؛ في المركز الثالث ، قم بتعيين ترميز السلسلة من bytearrayoutputstream التي تم إرجاعها. الثلاثة لا غنى عنها.
هذه المرة ، كان ينبغي أن تحل المشكلة ، لكن الحل لا يزال باللغة الصينية. إذن ماذا علي أن أفعل؟
3. بيئة إخراج تومكات خاطئة
استجابة لهذه النقطة ، يوفر شخص ما عبر الإنترنت مثل هذا الحل.
تعيين java_opts = ٪ java_opts ٪ logging_manager ٪ -dfile.encoding = utf -8
بعد الإعداد ، إعادة تشغيل Tomcat ، المشكلة هي أنه يمكن حلها ، ولكن التأثير الجانبي هو أن Tomcat بالكامل يعمل على الخادم (نافذة CMD الخاصة بـ Tomcat) ، وأعتقد أن هذا الحل غير مستحسن.
أضف الرمز التالي إلى الحرب الجارية
System.getProperty ("file.encoding") ؛ستندهش لتجد أن البيئة الجارية لـ Tomcat (Window Server 2008) تبين أنها GBK. أتساءل إذا لم تفاجأ. كنت خائفة ، لماذا ليس UTF-8؟ إذا كان GBK ، فسوف أضيف المزيد من صفحات UTF-8 إلى خطوتين أعلاه ، وأنا لا أفهم.
3. حل المشكلة
مع التجربة أعلاه ، نقوم بتعديل رمز WeChat4J التالي ، وخاصة النقطة الثانية.
السلسلة العامة toxml (Object OBJ) {String result = null ؛ حاول {jaxbcontext context = jaxbcontext.newinstance (obj.getClass ()) ؛ Marshaller M = context.createmarshaller () ؛ سلسلة الترميز = config.instance (). getjaxb_encoding () ؛ logger.debug ("toxml envoding" + enchoding + "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 = جديد bytearrayoutputstream () ؛ xmlserializer serializer = getxmlserializer (OS) ؛ M.Marshal (OBJ ، Serializer.ascontentHandler ()) ؛ النتيجة = OS.ToString (الترميز) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } logger.info ("نص الاستجابة:" + نتيجة) ؛ نتيجة الإرجاع ؛} xmlserializer private getxmlserializer (OutputStream OS) {outputFormat of = new OutputFormat () ؛ formatcdatatag () ؛ of.setcdataelements (cdatanode) ؛ of.SetPreservespace (true) ؛ of.SetIndenting (صواب) ؛ of.setomitxmldEclaration (true) ؛ سلسلة الترميز = config.instance (). getjaxb_encoding () ؛ of.setEncoding (الترميز) ؛ xmlserializer serializer = xmlserializer جديد (من) ؛ serializer.setOutputByTerem (OS) ؛ عودة مسلسل ؛}من بين هاتين الطريقتين ، نضيف طريقة ترميز قابلة للتكوين لتعيين GBK تلقائيًا (يتم تكوين GBK على الخادم الخاص بي) و GB2312 و UTF-8.
وبهذه الطريقة ، ستجد أن إخراج خلفية WeChat4J لم يعد في صينية مشوهة ، لكن المعلومات التي يتم إرجاعها إلى المستخدم أكثر فوضى.
كيف يمكن القيام بذلك؟ أنا مبرمج وأريد حقًا أن أقسم بضع كلمات أقسم. لكن لا تخف. نظرًا لأن سجل المسجل الخاص بـ WeChat4J لم يعد في صيني ، يمكن القول فقط أن هناك مشكلة أخرى في المرحلة الأولى.
يُعدِّل
استجابة.
لاحظ أن هذا لا يمكن أن يكون GBK ، يمكن أن يكون UTF-8 فقط. قلت إنني لا أعرف لماذا ، قدم مدير منتجات WeChat شرحًا.
النقطة الأساسية هي أن JaxB والاستجابة تحل بشكل مشترك الرموز المشوهة WeChat4J الصينية على النحو التالي:
WeChatController.java هو عنوان URL الذي تم تخصيصه لمنصة WeChat Public Development. يتم ضبط الاستجابة على النحو التالي
استجابة.
WeChat4J's Jaxbparser.java ، اضبط أساليب Toxml (Object OBJ) و getxmlserializer (OutputStream OS) على التوالي:
السلسلة العامة toxml (Object OBJ) {String result = null ؛ حاول {jaxbcontext context = jaxbcontext.newinstance (obj.getClass ()) ؛ Marshaller M = context.createmarshaller () ؛ ترميز السلسلة = config.instance (). getjaxb_encoding () ؛ // gbk logger.debug ("Toxml envoding" + الترميز + "system file.encoding" + system.getProperty ( M.SetProperty (Marshaller.jaxb_encoding ، الترميز) ؛ M.SetProperty (Marshaller.jaxb_formatted_output ، true) ؛ M.SetProperty (Marshaller.jaxb_fragment ، true) ؛ // قم بإزالة رأس الرسالة bytearrayoutputstream OS = جديد bytearrayoutputstream () ؛ xmlserializer serializer = getxmlserializer (OS) ؛ M.Marshal (OBJ ، Serializer.ascontentHandler ()) ؛ النتيجة = OS.ToString (الترميز) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } logger.info ("نص الاستجابة:" + نتيجة) ؛ نتيجة الإرجاع ؛} xmlserializer private getxmlserializer (OutputStream OS) {outputFormat of = new outputFormat () ؛ formatcdatatag () ؛ of.setcdataelements (cdatanode) ؛ of.SetPreservespace (true) ؛ of.SetIndenting (صواب) ؛ of.setomitxmldEclaration (true) ؛ ترميز السلسلة = config.instance (). getjaxb_encoding () ؛ // gbk of.setenCoding (الترميز) ؛ xmlserializer serializer = xmlserializer جديد (من) ؛ serializer.setOutputByTerem (OS) ؛ عودة مسلسل ؛} حسنًا ، كل شيء يسير على ما يرام.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.