XML을 사용하여 서버와 통신하는 모바일 클라이언트가 있습니다. 저는 새로운 전화기에서 아주 쉽게 접근 할 수있게 된 최근의 UTF-8 스마일을 보내야 할 때 문제가 생겼습니다. 예를 들면 :.스마일 같은 새로운 UTF-8에 대한 XML 지원
이제 안드로이드 애플리케이션은 인코딩과 보내기에 별다른 문제가 없지만 서버 쪽에서는 좀 더 폭발적인 경향이 있습니다.
우리는 관련 부분과 함께, 우리는 거대한 스택 트레이스를 얻을 수 위의 스마일 중 하나를 사용하여 메시지를 보내려고 경우
javax.xml.transform.TransformerException: org.xml.sax.SAXException: Invalid UTF-16 surrogate detected: d83d d83d ?
java.io.IOException: Invalid UTF-16 surrogate detected: d83d d83d ?
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(Unknown Source)
그리고 우리는 그것을 구문 분석하려고하면 :
2017-01-13 14:00:22,717 - com.zylinc.core.gatekeeper.stripes.DoBean - WARN - Could not handle request
org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 93; Character reference "&#
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at com.zylinc.core.gatekeeper.stripes.DoBean.parseRequest(DoBean.java:127)
at com.zylinc.core.gatekeeper.stripes.DoBean.execute(DoBean.java:56)
at com.zylinc.core.gatekeeper.Dispatcher.onRequest(Dispatcher.java:107)
at com.zylinc.core.gatekeeper.io.UntrustedSocketListener.handleRequest(UntrustedSocketListener.java:16)
at com.zylinc.core.gatekeeper.io.SocketListener$MessageHandler.run(SocketListener.java:228)
at java.lang.Thread.run(Unknown Source)
는 경우에 XML은 다음과 같습니다 이제
<?xml version="1.0" encoding="UTF-8"?><action>
<set>
<absence requestid="0" from="2017 01 13 13 00 11" to="2017 01 13 22 59 11" subject="��" user_id="CN=???????? ????????????,OU=TestUsers,OU=ZyUsers,DC=Zylinc,DC=com"/>
</set>
</action>
,이 클라이언트를 JSON 출력, 그러나 이동할 때 잘 작동하는 것 같다 JSON을 사용하는 것은 우리가 하룻밤 사이에 할 수있는 일이 아닙니다. 사용 된 문자가 Java 버전과 비교하여 너무 새롭기 때문에 깨지기는하지만, 새로운 스마일이 메시징을 깨뜨리지 않도록하는 것이 좋습니다.
XML을 구문 분석에 대한 코드는 매우 정직 :
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(handler);
StringReader reader = new StringReader(xml);
xmlReader.parse(new InputSource(reader));
편집 : XML을 생성
는 다음과 같이 수행됩니다
이DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
mDoc = builder.newDocument();
mRoot = mDoc.createElement("action");
mDoc.appendChild(mRoot);
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer trans = transFactory.newTransformer();
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
trans.setOutputProperty(OutputKeys.INDENT, "yes");
trans.setOutputProperty(OutputKeys.VERSION, "1.1");
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(mDoc);
trans.transform(source, result);
return sw.toString();
어디 텍스트를 추가 단순히입니다 :
xml.setAttribute(SUBJECT, obj.getSubject());
인코딩이나 기타를 지정해야합니까?
이모티콘이 들어있는 요소를 base64로 인코딩 할 수 밖에 없습니다. ASCII 제어 코드조차도 XML 텍스트와 같이 올바르지 않습니다. –
Stavr00