ho il seguente metodo di scrivere un XMLDOM ad un flusso:transformer.setOutputProperty (OutputKeys.ENCODING, "UTF-8") non funziona
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));
}
sto testando alcune altre funzionalità XML, e questo è solo il metodo che uso per scrivere su un file. Il mio programma di test genera 33 casi di test in cui i file sono scritti. 28 di loro hanno la seguente intestazione:
<?xml version="1.0" encoding="UTF-8"?>...
Ma per qualche ragione, 1 dei casi di test ora producono:
<?xml version="1.0" encoding="ISO-8859-1"?>...
E altri quattro prodotti:
<?xml version="1.0" encoding="Windows-1252"?>...
come si può vedere chiaramente, sto impostando la chiave di uscita ENCODING su UTF-8. Questi test utilizzati per lavorare su una versione precedente di Java. Non ho eseguito i test in un istante (più di un anno) ma in esecuzione oggi su "Java (TM) SE Runtime Environment (build 1.6.0_22-b04)" Ho questo comportamento divertente.
Ho verificato che i documenti che causano il problema sono stati letti da file che in origine erano codificati. Sembra che le nuove versioni delle librerie stiano tentando di preservare la codifica del file sorgente che è stato letto. Ma non è quello che voglio ... Voglio davvero che l'output sia in UTF-8.
Qualcuno sa di altri fattori che potrebbero impedire al trasformatore di ignorare le impostazioni di codifica UTF-8? C'è qualcos'altro che deve essere impostato sul documento per dire di dimenticare la codifica del file che è stato letto in origine?
UPDATE:
ho verificato lo stesso progetto su un'altra macchina, costruito e ha eseguito i test lì. Su quella macchina passano tutti i test! Tutti i file hanno "UTF-8" nella loro intestazione. Quella macchina ha "Java (TM) SE Runtime Environment (build 1.6.0_29-b11)" Entrambe le macchine eseguono Windows 7. Sulla nuova macchina che funziona correttamente, jdk1.5.0_11 viene utilizzato per creare la build, ma sul vecchio la macchina jdk1.6.0_26 viene utilizzata per creare la build. Le librerie utilizzate per entrambe le build sono esattamente le stesse. Può essere una incompatibilità JDK 1.6 con 1.5 al momento della compilazione?
UPDATE:
Dopo 4,5 anni, la libreria Java è ancora rotto, ma a causa del suggerimento di Vyrx di seguito, ho finalmente avere una soluzione adeguata!
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 soluzione è quella di disabilitare la scrittura dell'intestazione, e scrivere l'intestazione corretta prima serializzazione XML per il vapore in uscita. Lame, ma produce i risultati corretti. I test interrotti più di 4 anni fa sono di nuovo in esecuzione!
Questo in effetti sembra un po 'di bug o incompatibilità problema. È improbabile che qualcuno possa aiutare senza un banco di prova riproducibile. Puoi fornire [SSCCE] (http://sscce.org/) ed elencare tutte le versioni degli strumenti/librerie? – sleske
Ci sono molti posti dove controllare la tua Locale. Il tuo computer locale ha una locale, il tuo IDE potrebbe avere un Locale e il tuo processo JVM ha un Locale. Ho visto problemi come questo quando i miei Local stavano cambiando. Come stai facendo i test? java.exe, maven, IDE? –
Come ho specificato direttamente UTF-8, le impostazioni internazionali non dovrebbero avere importanza, ma per rispondere direttamente alla tua domanda, il codice di prova viene richiamato come una chiamata da riga di comando a Java.exe, su un sistema Windows, situato sulla costa del Pacifico degli Stati Uniti. e configurato per il fuso orario USA inglese e Pacifico. – AgilePro