2015-02-16 5 views
1

Я использую Java 6. У меня есть шаблон XML, который начинается, как такКак Apache commons IO конвертирует мой XML-заголовок из UTF-8 в UTF-16?

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

Однако я заметил, когда я анализирую и выводить его с помощью следующего кода (с помощью Apache Commons-IO 2.4) ...

Document doc = null; 
    InputStream in = this.getClass().getClassLoader().getResourceAsStream(“my-template.xml”); 

    try 
    { 
     byte[] data = org.apache.commons.io.IOUtils.toByteArray(in); 
     InputSource src = new InputSource(new StringReader(new String(data))); 

     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     doc = builder.parse(src); 
    } 
    finally 
    { 
     in.close(); 
    } 

Первая строка выводится как

<?xml version="1.0" encoding="UTF-16”?> 

что мне нужно делать при разборе/вывода файла таким образом, что кодирование заголовка будет оставаться «UTF-8»?

Edit: За предложение данного, я изменил мой код

Document doc = null; 
    InputStream in = this.getClass().getClassLoader().getResourceAsStream(name); 

    try 
    { 
     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder builder = factory.newDocumentBuilder(); 
     doc = builder.parse(in); 
    } 
    finally 
    { 
     in.close(); 
    } 

Но несмотря на то, первая линия моего входного элемента шаблона файла является

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

, когда я выходной документ как a Строка, которую она производит

<?xml version="1.0" encoding="UTF-16"?> 

как ель й линии. Вот что я использую для вывода «Doc» объект в виде строки ...

private String getDocumentString(Document doc) 
{ 
    DOMImplementationLS domImplementation = (DOMImplementationLS)doc.getImplementation(); 
    LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
    return lsSerializer.writeToString(doc); 
} 

ответ

0

Оказывается, что, когда я изменил свой документ -> метод Строка

private String getDocumentString(Document doc) 
{ 
    String ret = null; 
    DOMSource domSource = new DOMSource(doc); 
    StringWriter writer = new StringWriter(); 
    StreamResult result = new StreamResult(writer); 
    TransformerFactory tf = TransformerFactory.newInstance(); 
    Transformer transformer; 
    try 
    { 
     transformer = tf.newTransformer(); 
     transformer.transform(domSource, result); 
     ret = writer.toString(); 
    } 
    catch (TransformerConfigurationException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (TransformerException e) 
    { 
     e.printStackTrace(); 
    } 
    return ret; 
} 

на 'кодирование = "UTF-8"' заголовки больше не получили выходной, как 'кодирование = "UTF-16"'.

2
new StringReader(new String(data)) 

Это неправильно. Вы должны позволить парсер определить кодировку документа с помощью (например) DocumentBuilder.parse(InputStream):

doc = builder.parse(in); 

Что кодирующая DOM сериализации, зависит от того, как вы пишете. Внутренняя память DOM не имеет понятия кодирования.

Запись документа в строку с декларацией UTF-8:

import java.io.StringWriter; 
import javax.xml.parsers.DocumentBuilderFactory; 
import org.w3c.dom.Document; 
import org.w3c.dom.ls.*; 

public class DomIO { 
    public static void main(String[] args) throws Exception { 
     Document doc = DocumentBuilderFactory.newInstance() 
              .newDocumentBuilder() 
              .newDocument(); 
     doc.appendChild(doc.createElement("foo")); 
     System.out.println(getDocumentString(doc)); 
    } 

    public static String getDocumentString(Document doc) { 
     DOMImplementationLS domImplementation = (DOMImplementationLS) 
               doc.getImplementation(); 
     LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
     LSOutput lsOut = domImplementation.createLSOutput(); 
     lsOut.setEncoding("UTF-8"); 
     lsOut.setCharacterStream(new StringWriter()); 
     lsSerializer.write(doc, lsOut); 
     return lsOut.getCharacterStream().toString(); 
    } 
} 

LSOutput также binary stream support, если вы хотите, чтобы сериализатору правильно кодировать документ на выходе.

+1

Привет, спасибо. Несмотря на это, первая строка моего шаблона документа по-прежнему выводится с заголовком кодировки «UTF-16» вместо «UTF-8». Возможно, это то, как я конвертирую объект Document в String, и я редактировал свой вопрос для включения. –