0

我对 XML 编码有疑问。当我在 localhost 上使用 cp1251 编码创建 XML 时,一切都很酷
但是当我在服务器上部署我的模块时,xml 文件有不正确的符号,如“ФайлПФД

 StringWriter writer = new StringWriter();
 StreamResult result = new StreamResult(writer);
 DOMSource source = new DOMSource(doc);

 transformer.setOutputProperty(OutputKeys.ENCODING, "cp1251");
 transformer.setOutputProperty(OutputKeys.INDENT, "yes");
 transformer.transform(source, result);

 String attach = writer.toString();

我该如何解决?

4

2 回答 2

3

我尝试读取DocumentUTF-8编码的 XML,并尝试使用不同的编码对其进行转换,这根本没有任何效果(使用文档的现有编码而不是我在输出属性中指定的编码)。在内存中创建新文档时(编码为空),正确使用了输出属性。

看起来在转换 XML 时Document,输出属性OutputKeys.ENCODING仅在org.w3c.dom.Document没有编码时使用。

解决方案
更改XML 文档的编码,不要使用Document作为源,而是使用它的根节点(文档元素)。

// use doc.getDocumentElement() instead of doc
DOMSource source = new DOMSource(doc.getDocumentElement());

奇迹般有效。

源文件:

<?xml version="1.0" encoding="UTF-8"?>
<foo bla="Grüezi">
    Encoding test äöüÄÖÜ «Test»
</foo>

输出“cp1251”:

<?xml version="1.0" encoding="WINDOWS-1251"?><foo bla="Gr&#252;ezi">
    Encoding test &#228;&#246;&#252;&#196;&#214;&#220; «Test»
</foo>
于 2015-04-07T08:42:35.720 回答
0

(String)Writer 不会受到输出编码的影响(仅受使用的输入编码的影响),因为 Java 以 Unicode 维护所有文本。要么写入二进制文件,要么将字符串输出为 Cp1251。

请注意,编码应该<?xml encoding="Windows-1251">在行中。而且我猜“Cp1251”更特定于java。

所以错误可能在于字符串的写入;例如

response.setCharacterEncoding("Windows-1251");
response.write(attach);

或者

attach.getBytes("Windows-1251")
于 2015-04-07T08:59:33.760 回答