Wir haben einen mobilen Client, der mit dem Server unter Verwendung von XML kommuniziert. Ich bin auf ein Problem gestoßen, als wir einige der neueren UTF-8-Smileys senden mussten, die auf neuen Handys sehr leicht zugänglich gemacht wurden. Zum Beispiel: .XML-Unterstützung für neue UTF-8 wie Smileys
Jetzt hat meine Android-Anwendung kein Problem mit der Codierung und dem Senden dieser, aber auf der Serverseite neigen Dinge dazu, ein bisschen mehr explodieren.
Wenn wir versuchen, eine Nachricht zu senden einen des smileys unter Verwendung der oben wir einen riesigen Stack-Trace, mit dem entsprechenden Teil erhalten:
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)
Und wenn wir versuchen, es zu analysieren:
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)
In diesem Fall wird die XML ist:
<?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>
Nun scheint dies gut zu funktionieren, wenn JSON ausgibt, aber die Bewegung der Kunden JSON zu verwenden, können wir nicht über Nacht tun. Ich schätze, es bricht, weil die verwendeten Zeichen im Vergleich zur Java-Version zu neu sind, aber es wäre schön, sicherzustellen, dass neuere Smileys das Messaging nie unterbrechen werden.
Der Code die XML für die Analyse ist ziemlich geradlinig:
SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
XMLReader xmlReader = parser.getXMLReader();
xmlReader.setContentHandler(handler);
StringReader reader = new StringReader(xml);
xmlReader.parse(new InputSource(reader));
Edit:
das Erstellen von XML wie dies geschehen ist:
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();
Wo Hinzufügen der Text ist einfach:
xml.setAttribute(SUBJECT, obj.getSubject());
Muss ich eine Codierung oder eine andere angeben?
Sie können keine andere Wahl haben, als base64 die Elemente zu codieren, die Emojis enthalten. Auch ASCII-Steuercodes illegal als XML-Text, wie –
Stavr00