Написание русского в XML - PullRequest
       2

Написание русского в XML

4 голосов
/ 03 апреля 2010

Я пишу класс Xml Tag Renamer с Java, который читает XML, переименовывает теги и записывает их обратно в другой файл XML, используя DocumentBuilderFactory и TransformerFactory (текстовые узлы сохраняются). До этого он работал нормально с текстами на немецком и английском языках, до сегодняшнего дня, когда я пытался переименовать файл XML с русским текстом. Вместо исходных текстов я получил ????? во вновь созданном XML-файле. Я пробовал установить кодировку

Есть идеи, как это исправить?

PS. Строки были правильными до входа в TransformerFactory, как я проверил в отладчике. Я пробовал установить OutputKeys.ENCODING в UTF-8 и ISO-8859-5. Никто из них не помог.

Трансформаторная часть:

// Output the XML

// Set up a transformer
TransformerFactory transFactory = TransformerFactory.newInstance();
Transformer transformer = transFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
// Fix to a bug about indent in transformer
transformer.setOutputProperty
("{http://xml.apache.org/xslt}indent-amount", "4");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");

// TODO encoding parameter
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

// Create string from xml tree
StringWriter sw = new StringWriter();
StreamResult result = new StreamResult(sw);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);

String xmlString = sw.toString();

xmlString.replaceAll("\n", System.getProperty("line.separator"));


// Write to file
BufferedWriter output = new BufferedWriter(new FileWriter(outputPath));
output.write(xmlString);
output.close();

Ответы [ 2 ]

3 голосов
/ 03 апреля 2010

Я бы предложил напрямую выводить результат из преобразователя в файл:

transformer.transform(source, new StreamResult(
   new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));
1 голос
/ 03 апреля 2010

Ваша проблема (почти наверняка) в том, что вы смешиваете, что такое символ и что такое байт. Это то, с чем вы можете справиться на английском (и в основном на немецком языке), но в таких шрифтах, как кириллица, японский и китайский, вы должны сделать это правильно. Первое, что нужно проверить, есть ли у вас символы вне диапазона \u0000 - \u00ff в переменной xmlString. Если это так, вы должны использовать экземпляр OutputStreamWriter для отображения символов в байты. Если нет, преобразование уже применено, и вместо этого вам нужно записать байты, захваченные в этой строке, в файл, не обрабатывая их дальше (опять же, OutputStreamWriter - самый простой способ получить это право, но с использованием ISO8859-1 кодирование на этом последнем этапе, поскольку это не перераспределяет байты вокруг).

Вывод преобразованного XML непосредственно из преобразователя проще, чем сначала захватить его. В конце концов, большинство XML читается только человеком в техническом смысле ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...