У меня есть следующий способ записи XMLDom в поток:
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));
}
Я тестирую некоторые другие функции XML, и это всего лишь метод, который я использую для записи в файл. Моя тестовая программа генерирует 33 тестовых примера, где файлы выписаны. 28 из них имеют следующий заголовок:
<?xml version="1.0" encoding="UTF-8"?>...
Но по какой-то причине 1 из тестовых случаев теперь производит:
<?xml version="1.0" encoding="ISO-8859-1"?>...
И еще четыре продукта:
<?xml version="1.0" encoding="Windows-1252"?>...
Как вы можете ясно видеть, я устанавливаю выходной ключ ENCODING в UTF-8. Эти тесты использовались для более ранней версии Java. Я не запускал тесты через некоторое время (более года), но работает сегодня в среде Java Runtime Environment (build 1.6.0_22-b04) "Я получаю это смешное поведение.
Я проверил, что документы, вызывающие проблему, были прочитаны из файлов, которые первоначально имели такую кодировку. Кажется, что новые версии библиотек пытаются сохранить кодировку исходного файла, который был прочитан. Но это не то, что я хочу... Я действительно хочу, чтобы выход был в UTF-8.
Кто-нибудь знает какой-либо другой фактор, который может заставить трансформатор игнорировать настройку кодировки UTF-8? Есть ли что-то еще, что должно быть установлено в документе, чтобы сказать, чтобы забыть кодировку файла, который был первоначально прочитан?
UPDATE:
Я проверил один и тот же проект на другой машине, построил и проверил тесты там. На этой машине проходят все тесты! Все файлы имеют "UTF-8" в заголовке. У этой машины есть "среда выполнения Java (TM) SE Runtime Environment (сборка 1.6.0_29-b11)". Обе машины работают под управлением Windows 7. На новом компьютере, который работает правильно, jdk1.5.0_11 используется для создания сборки, но на старой машина jdk1.6.0_26 используется для создания сборки. Библиотеки, используемые для обеих сборников, абсолютно одинаковы. Может ли это быть несовместимостью JDK 1.6 с 1.5 во время сборки?
UPDATE:
Через 4,5 года библиотека Java по-прежнему сломана, но из-за предложения Vyrx ниже я наконец нашел правильное решение!
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));
}
Решение состоит в том, чтобы отключить запись заголовка и написать правильный заголовок непосредственно перед сериализацией XML в выходной поток. Хромой, но он дает правильные результаты. Тесты, разбитые более 4 лет назад, теперь снова запущены!