Mam następujący sposób napisania XMLDom do strumienia:transformer.setOutputProperty (OutputKeys.ENCODING, "UTF-8") nie działa
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));
}
jestem testowania jakieś inne funkcjonalności XML, a to jest po prostu metodą, której używam do zapisu w pliku. Mój program testowy generuje 33 przypadki testowe, w których zapisywane są pliki. 28 z nich mają następujący nagłówek:
<?xml version="1.0" encoding="UTF-8"?>...
Ale z jakiegoś powodu, 1 przypadków testowych teraz produkować:
<?xml version="1.0" encoding="ISO-8859-1"?>...
i cztery więcej produkujemy:
<?xml version="1.0" encoding="Windows-1252"?>...
jak można wyraźnie widzisz, ustawiam klucz wyjściowy ENCODING na UTF-8. Testy te działały na wcześniejszej wersji Java. Nie uruchomiłem testów od jakiegoś czasu (ponad rok), ale dzisiaj działam w środowisku Java Runtime Environment (build 1.6.0_22-b04) "Dostaję to zabawne zachowanie.
Sprawdziłem, czy dokumenty powodujące problem zostały odczytane z plików, które pierwotnie miały te kodowanie. Wygląda na to, że nowe wersje bibliotek próbują zachować kodowanie odczytanego pliku źródłowego. Ale to nie jest to, czego chcę ... Naprawdę chcę, żeby wyjście było w UTF-8.
Czy ktoś wie o jakimkolwiek innym czynniku, który może spowodować, że transformator zignoruje ustawienie kodowania UTF-8? Czy jest coś jeszcze, co należy ustawić w dokumencie, aby zapomnieć o kodowaniu pliku, który został pierwotnie odczytany?
UPDATE:
I wyrejestrowany tego samego projektu na innym komputerze, zbudowany i prowadził tam badania. Na tym komputerze wszystkie testy mijają! Wszystkie pliki mają "UTF-8" w nagłówku. Ta maszyna ma "Java (TM) SE Runtime Environment (kompilacja 1.6.0_29-b11)" Na obu komputerach działa Windows 7. Na nowej maszynie, która działa poprawnie, jdk1.5.0_11 służy do budowania, ale na starym maszyna jdk1.6.0_26 służy do tworzenia kompilacji. Biblioteki używane w obu wersjach są dokładnie takie same. Czy może to być niezgodność JDK 1.6 z 1.5 w czasie kompilacji?
UPDATE:
Po 4,5 roku, biblioteki Java jest nadal uszkodzony, ale z powodu sugestii Vyrx poniżej, w końcu ma właściwe rozwiązanie!
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));
}
Rozwiązaniem jest wyłączenie pisanie nagłówka i napisać poprawny nagłówek tuż przed szeregowania XML do pary wyjściowej. Lame, ale daje prawidłowe wyniki. Testy zerwane ponad 4 lata temu są teraz uruchomione ponownie!
To rzeczywiście wygląda jak jakiś błąd lub niezgodności problemu. Jest mało prawdopodobne, aby ktokolwiek mógł pomóc bez powtarzalnej wersji testowej. Czy możesz podać [SSCCE] (http://sscce.org/) i wymienić wszystkie wersje narzędzi/bibliotek? – sleske
Istnieje kilka miejsc, w których należy sprawdzić lokalizację. Twój lokalny komputer ma ustawienia regionalne, twój IDE może mieć ustawienia regionalne, a proces JVM ma ustawienia regionalne. Widziałem już takie problemy, zanim zmieniły się moje ustawienia regionalne. Jak prowadzisz testy? java.exe, maven, IDE? –
Ponieważ określiłem kodowanie UTF-8 bezpośrednio, ustawienia regionalne nie powinny mieć znaczenia, ale aby bezpośrednio odpowiedzieć na twoje pytanie, kod testowy jest wywoływany jako wywołanie linii komend do Java.exe, w systemie Windows, zlokalizowanym na wybrzeżu Pacyfiku w USA. i skonfigurowane dla strefy czasowej w USA i Pacyfiku. – AgilePro