어떤 프로그래머 친구가 그가 중국어가 달린 코드의 문제에 직면하지 않았다고 말하면, 나는 그것을 믿고 싶지 않을 것입니다. 오늘, WeChat 구독 계정에 현명한 답변을 할 때, 나는 혼란스러운 방식으로 중국의 엉덩이 코드의 불 구덩이에 뛰어 들었습니다. 내가 문제를 처음 해결했을 때, 나는 그녀가 한 번 가져온 고통을 응원하고 완전히 잊어 버렸다.
1. 문제 설명
그것을 보았을 때, 빨간색 프레임의 멍청한 코드는 나에게 자발적으로 도발되었지만 나는 무력했습니다. 너무 나빴어.
2. 해결책을 찾으십시오
문제에 직면 할 때는 칼로 만 해결하도록 강요 할 수 있습니다. 당신은 무엇을 할 수 있습니까?
우선, WeChat 지능형 답변의 메커니즘을 이해하고 다음과 같이 그림을 그려야합니다.
추신, 도구를 잘 사용하지 않은 것에 대해 사과하십시오.
다음으로 핵심 요점에 초점을 맞추고 차량 코드가 중요한 위치를 살펴 보겠습니다.
1. 컨트롤러가 사용자에게 반환됩니다
response.setHeader ( "Content-Type", "text/html; charset = utf-8"); // 브라우저 인코딩 응답.
이 코드만으로 응답을 지정하는 인코딩 방법은 UTF-8입니다. 멍청한 문제가 개선되어야한다는 것은 논리적이지만 결과는 여전히 그렇지 않습니다.
2. Jaxb의 Toxml
public String toxml (object obj) {문자열 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 = new BytearRayoutputStream (); xmlserializer serializer = getxmlserializer (OS); M.marshal (obj, serializer.ascontenthandler ()); 결과 = os.toString ( "UTF-8"); } catch (예외 e) {e.printstacktrace (); } logger.info ( "응답 텍스트 :" + 결과); 리턴 결과;} 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 = 새로운 xmlserializer (of); Serializer.setOutputByTestream (OS); 반환 시리얼 라이저;} 다음은 세 가지 요점입니다.
1. M.SetProperty (Marshaller.jaxb_encoding, "UTF-8");
2. getxmlserializer (OS)
3. OS.TOSTRING ( "UTF-8");
위의 세 곳은 트랜스 코딩과 관련이 있음을 알 수 있습니다. 우선, 마샬러 인코딩을 설정하십시오. 두 번째 장소에서 전체 XMLSerializer 인코딩을 설정하십시오. 세 번째 장소에서는 반환 된 BytearRayoutputStream의 문자열 인코딩을 설정하십시오. 세 가지 모두 필수 불가능합니다.
이번에는 문제를 해결해야했지만 솔루션은 여전히 중국어가 있습니다. 그래서 어떻게해야합니까?
3. Tomcat의 출력 환경이 잘못되었습니다
이 시점에 따라 온라인으로 누군가가 그러한 솔루션을 제공합니다.
set java_opts =% java_opts% logging_manager% -dfile.encoding = utf -8
설정 후 Tomcat을 다시 시작한 후 문제는 해결할 수 있다는 것입니다. 그러나 부작용은 전체 Tomcat이 서버에서 출력을 실행한다는 것입니다 (Tomcat의 CMD Wind
달리기 전쟁에 다음 코드를 추가하십시오
system.getProperty ( "file.encoding");
Tomcat (Window Server 2008)의 실행 환경이 GBK로 판명된다는 사실에 놀랄 것입니다. 당신이 놀라지 않는지 궁금합니다. 무서웠 어, 왜 UTF-8이 아님? 그것이 GBK 인 경우 위의 두 단계에 UTF-8 페이지를 추가 할 것입니다. 이해가 안 돼요.
3. 문제를 해결하십시오
위의 경험을 통해 다음 Wechat4J 코드 (주로 두 번째 포인트)를 수정합니다.
public String toxml (object obj) {문자열 result = null; {jaxbcontext context = jaxbcontext.newinstance (obj.getClass ()); Marshaller m = context.createmarshaller (); 문자열 encoding = config.instance (). getJaxb_encoding (); logger.debug ( "TOXML 인코딩" + 인코딩 + "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 ()); 결과 = os.tostring (인코딩); } catch (예외 e) {e.printstacktrace (); } logger.info ( "응답 텍스트 :" + 결과); 리턴 결과;} private xmlserializer getxmlserializer (outputStream os) {outputformat of = new outputformat (); Formatcdatatag (); of.setcdataelements (cdatanode); of.setpreservespace (true); of.setindenting (true); of.setomitxmldeclaration (true); 문자열 encoding = config.instance (). getJaxb_encoding (); of.setencoding (인코딩); xmlserializer serializer = 새로운 xmlserializer (of); Serializer.setOutputByTestream (OS); 반환 시리얼 라이저;}이 두 가지 방법 중에서 GBK를 자동으로 설정하기 위해 구성 가능한 인코딩 메소드를 추가합니다 (GBK는 내 서버에서 GBK가 구성), GB2312 및 UTF-8.
이런 식으로 WeCHAT4J의 배경 출력이 더 이상 중국어가 아니라는 것을 알 수 있지만 사용자에게 반환 된 정보는 훨씬 더 지저분합니다.
이 작업은 어떻게 할 수 있습니까? 나는 프로그래머이고 정말 욕설을 맹세하고 싶습니다. 그러나 두려워하지 마십시오. WeChat4J의 로거 로그는 더 이상 중국어가 없기 때문에 첫 번째 단계에는 또 다른 문제가 있다고 말할 수 있습니다.
조정하다
response.setHeader ( "Content-Type", "Text/Html; charset = utf-8"); // 브라우저 인코딩 응답.
이것은 GBK 일 수 없으며 UTF-8 일 수 있습니다. 왜 WeChat의 제품 관리자가 설명을했는지 모르겠다고 말했습니다.
핵심 요점은 JAXB와 응답이 공동으로 wechat4j 중국의 갈색 코드를 다음과 같이 선언한다는 것입니다 .
wechatcontroller.java는 WeChat Public Development 플랫폼에 할당 된 URL입니다. 응답은 다음과 같이 조정됩니다
response.setHeader ( "Content-Type", "Text/Html; charset = utf-8"); // 브라우저 인코딩 응답.
wechat4j의 jaxbparser.java, toxml (object obj) 및 getxmlserializer (outputstream os) 메소드를 조정합니다.
public String toxml (object obj) {문자열 result = null; {jaxbcontext context = jaxbcontext.newinstance (obj.getClass ()); Marshaller m = context.createmarshaller (); String encoding = config.instance (). getJaxb_encoding (); // gbk logger.debug ( "Toxml 인코딩" + 인코딩 + "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 ()); 결과 = os.tostring (인코딩); } catch (예외 e) {e.printstacktrace (); } logger.info ( "응답 텍스트 :" + 결과); 리턴 결과;} 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 = 새로운 xmlserializer (of); Serializer.setOutputByTestream (OS); 반환 시리얼 라이저;} 좋아, 모든 것이 잘 진행되고 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.