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!

Diese tatsächlich Aussehen einige bug oder eine Inkompatibilität problem. Es ist unwahrscheinlich, dass jemand helfen kann, ohne einen reproduzierbaren testcase. Können Sie eine SSCCE, und eine Liste mit allen Versionen der tools/Bibliotheken?
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

Schreibe einen Kommentar