Transformator.setOutputProperty(OutputKeys.ENCODING, "UTF-8") funktioniert NICHT
Habe ich die folgende Methode schreiben, die ein XMLDom zu einem stream:
public void writeToOutputStream(Document fDoc, OutputStream out) throws Exception {
fDoc.setXmlStandalone(true);
DOMSource docSource = new DOMSource(fDoc);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
transformer.transform(docSource, new StreamResult(out));
}
Teste ich einige andere XML-Funktionen, und dies ist nur die Methode, die ich verwenden, um eine Datei zu schreiben. Mein test-Programm erzeugt 33 test-Fälle, in denen Dateien geschrieben werden. 28 von Ihnen haben den folgenden header:
<?xml version="1.0" encoding="UTF-8"?>...
Aber für einige Grund, 1 der Testfälle erzeugen jetzt:
<?xml version="1.0" encoding="ISO-8859-1"?>...
Vier weitere zu produzieren:
<?xml version="1.0" encoding="Windows-1252"?>...
Wie Sie deutlich sehen können, ich bin Einstellung der ZEICHENCODIERUNG Ausgabe-Taste, um UTF-8. Diese tests verwendet, um die Arbeit auf eine frühere Java-version. Ich habe nicht die tests ausführen, die in eine Weile (mehr als ein Jahr) aber läuft heute auf "Java(TM) SE Runtime Environment (build 1.6.0_22-b04)" ich bekomme dieses komische Verhalten.
Habe ich festgestellt, dass die Dokumente, die das problem verursacht wurden, Lesen aus Dateien, die Sie ursprünglich hatten diese Codierung. Es scheint, dass die neuen Versionen der Bibliotheken, die versuchen zu bewahren, Sie die Kodierung der Quelldatei gelesen wurde. Aber das ist nicht das, was ich will ... ich will wirklich die Ausgabe in UTF-8.
Kennt jemand eine andere Faktor, der möglicherweise den Transformator zu ignorieren, die UTF-8-Kodierung einstellen? Gibt es etwas anderes, das gesetzt werden muss, um auf das Dokument zu sagen, zu vergessen, die Codierung der Datei, die ursprünglich gelesen?
UPDATE:
Ich habe das gleiche Projekt auf einem anderen Rechner gebaut und ran an die tests dort. Auf dieser Maschine alle tests übergeben! Alle Dateien mit "UTF-8" im header. Diese Maschine hat "Java(TM) SE Runtime Environment (build 1.6.0_29-b11)" Beide Maschinen unter Windows 7. Auf dem neuen Computer, der ordnungsgemäß funktioniert, jdk1.5.0_11 verwendet wird, um die zu bauen, aber auf dem alten Rechner jdk1.6.0_26 verwendet wird, um die zu bauen. Die Bibliothek für beide builds sind exakt die gleichen. Kann es sein das JDK 1.6 Inkompatibilität mit 1.5 zu erstellen?
UPDATE:
Nach 4,5 Jahren, die Java-Bibliothek ist immer noch gebrochen, aber aufgrund der Anregung durch Vyrx unten, habe ich endlich eine richtige Lösung!
public void writeToOutputStream(Document fDoc, OutputStream out) throws Exception {
fDoc.setXmlStandalone(true);
DOMSource docSource = new DOMSource(fDoc);
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
transformer.setOutputProperty(OutputKeys.INDENT, "no");
out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>".getBytes("UTF-8"));
transformer.transform(docSource, new StreamResult(out));
}
Die Lösung ist das deaktivieren der Schrift der Kopfzeile, und schreiben Sie die richtigen header, nur vor dem serialisieren der XML-Ausgabe Dampf. Lame, aber es erzeugt die richtigen Ergebnisse. Tests kaputt über 4 Jahren laufen nun wieder!
Es gibt mehrere Orte, um zu überprüfen, die für Ihr Gebietsschema. Ihre lokalen computer ein Gebietsschema, die IDE haben könnte ein Gebietsschema, und Ihre JVM-Prozess hat ein Gebietsschema. Ich habe gesehen, Probleme wie diese vor, wenn mein Locales verändert wurden. Wie sind Sie mit der Ausführung der tests? java.exe, maven, IDE?
Ich habe wie angegeben UTF-8 direkt, das Gebietsschema, sollte keine Rolle spielen, aber zur Beantwortung Ihrer Frage direkt, den test-code aufgerufen wird, wird als Kommandozeilen-Aufruf Java.exe auf einem windows-system, das sich auf der Pazifischen Küste der USA, und konfiguriert für Englisch (USA) und Pacific-Zeitzone.
Sollten Sie SSCCE. Sonst niemand kann Ihr problem reproduzieren, weder eine Antwort geben.
können Sie überprüfen, wie ist der Ausgabestrom angelegt ?
InformationsquelleAutor AgilePro | 2013-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem auf Android beim serialisieren von emoji-Zeichen. Bei der Verwendung von UTF-8-Codierung in der Transformator wurde die Ausgabe von HTML Zeichen-Entitäten (UTF-16-Ersatzzeichen Paare), die später brechen andere Parser, der die Daten zu Lesen.
Dies ist, wie ich landete Lösung:
Ich habe umgeschrieben, diese Idee richtig verwenden, Bäche und geben Sie den Kredit für die Antwort. (vielen Dank!) Wie du geschrieben hätten, hätten Sie drei Kopien des Dokuments im Speicher an der gleichen Zeit. Für kleine XML kein problem, aber in der Regel mit drei Kopien von wichtigen Daten-Datei im Speicher ist nicht effizient. Ein besserer Ansatz ist, einfach mal den header vor dem serialisieren der XML-writer. Ich schrieb Ihre Antwort zu machen, nur 2 Kopien der XML-Datei in Speicher.
InformationsquelleAutor Vyrx
Zur Beantwortung der Frage folgende code funktioniert für mich. Dieser kann in Eingabe-Codierung und konvertieren Sie die Daten in der Ausgabe-Kodierung.
InformationsquelleAutor Ramesh Reddy
Hab ich verbrachte viel viel Zeit zum Debuggen dieses Thema, weil es funktioniert gut auf meinem Rechner (Ubuntu 14 + Java 1.8.0_45), war aber nicht richtig arbeiten in der Produktion (Alpine Linux + Java 1.7).
Entgegen meiner Erwartung folgt aus der oben genannten Antwort nicht helfen.
aber diese funktionierte wie erwartet
InformationsquelleAutor expert
was?:
InformationsquelleAutor Kintan K
Konnte ich das problem umgehen, indem er das Document-Objekt übergeben, um die DOMSource Konstruktor. Die Methode getXmlEncoding meiner wrapper-gibt immer null, alle anderen Methoden sind Delegierte an der eingebundenen Dokument-Objekt.
InformationsquelleAutor Andreas Flueckiger
Ich bin dabei, ein wilder Schuss hier, aber Sie erwähnen, dass Sie das Lesen von Dateien für die Daten der tests.
Können Sie sicherstellen, dass Sie die Dateien Lesen, die mit der richtigen Codierung, so dass, wenn Sie schreiben in Ihren Ausgabestrom haben Sie bereits die Daten in der richtigen Codierung?
So etwas wie new InputStreamReader(new FileInputStream(fileDir), "UTF8").
Vergessen Sie nicht, dass single-argument Konstruktoren von FileReader verwenden Sie immer die Plattform-default-encoding : Die Konstruktoren dieser Klasse davon ausgegangen, dass die Standard-Zeichenkodierung und die Standard-byte-Puffer-Größe angemessen sind.
InformationsquelleAutor Carlos
Versuchen Sie, die Codierung auf Ihre StreamResult speziell:
So, sollte es nur in der Lage sein zu schreiben, die in UTF-8.
InformationsquelleAutor Steve K