transformer.setOutputProperty (OutputKeys.ENCODING, "UTF-8") ne fonctionne PAS

J'ai la méthode suivante pour écrire un XMLDom à un flux de données:

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));
}

Je suis en train de tester quelques autres fonctionnalités XML, et c'est juste la méthode que j'utilise pour écrire dans un fichier. Mon programme de test génère 33 test les cas où les fichiers sont écrits. 28 d'entre eux ont l'en-tête suivant:

<?xml version="1.0" encoding="UTF-8"?>...

Mais pour une raison quelconque, 1 des cas de test maintenant produire:

<?xml version="1.0" encoding="ISO-8859-1"?>...

Et quatre plus de produits:

<?xml version="1.0" encoding="Windows-1252"?>...

Comme vous pouvez le voir clairement, je suis en train de CODAGE de clé de sortie de l'UTF-8. Ces tests sont utilisés pour travailler sur une version antérieure de Java. Je n'ai pas exécuter les tests dans un certain temps (plus d'un an) mais en cours aujourd'hui sur "Java(TM) SE Runtime Environment (build 1.6.0_22-b04)" je reçois ce drôle de comportement.

J'ai vérifié que les documents à l'origine du problème ont été lues à partir des fichiers qui étaient à l'origine ceux de l'encodage. Il semble que les nouvelles versions des bibliothèques tentent de préserver l'encodage du fichier source qui a été lu. Mais ce n'est pas ce que je veux ... je veux vraiment la sortie pour être en UTF-8.

Personne ne sait de tout autre facteur qui pourrait causer le transformateur d'ignorer le codage UTF-8? Est-il autre chose qui doit être réglée sur le document à-dire d'oublier l'encodage du fichier qui était à l'origine de la lire?

Mise à JOUR:

J'ai vérifié le même projet sur un autre ordinateur, construit et gère les tests. Sur cette machine tous les tests passent! Tous les fichiers ont "UTF-8" dans leur en-tête. Cette machine a "Java(TM) SE Runtime Environment (build 1.6.0_29-b11)" les Deux machines sont en cours d'exécution Windows 7. Sur la nouvelle machine qui fonctionne correctement, jdk1.5.0_11 est utilisé pour faire de la place, mais sur l'ancienne machine jdk1.6.0_26 est utilisé pour faire de la construction. Les bibliothèques utilisées pour les deux versions sont exactement les mêmes. Peut-il être un JDK 1.6 incompatibilité avec 1,5 au moment de la construction?

Mise à JOUR:

Après 4,5 ans, la bibliothèque Java est toujours en panne, mais en raison de la suggestion par Vyrx ci-dessous, j'ai enfin une solution adéquate!

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));
}

La solution est de désactiver l'écriture de l'en-tête, et à l'écriture de l'en-tête correcte juste avant la sérialisation XML à la sortie de la vapeur. Boiteux, mais il produit des résultats corrects. Tests cassé il y a 4 ans sont maintenant en cours d'exécution à nouveau!

source d'informationauteur AgilePro