gpt4 book ai didi

java - Apache commons IO 如何将我的 XML header 从 UTF-8 转换为 UTF-16?

转载 作者:行者123 更新时间:2023-11-30 03:33:10 24 4
gpt4 key购买 nike

我使用的是 Java 6。我有一个 XML 模板,其开头如下

<?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”?>

解析/输出文件时我需要做什么才能使 header 编码保持为“UTF-8”?

编辑:根据给出的建议,我将代码更改为

    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"?>

当我将文档输出为字符串时,它会生成

<?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);
}

最佳答案

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如果您希望序列化器在输出时正确编码文档。

关于java - Apache commons IO 如何将我的 XML header 从 UTF-8 转换为 UTF-16?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28546634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com