我曾经通过调用toXml()来编组模型:
@XmlRootElement
public class MyModel {
private String body;
public String getBody() {
return this.body;
}
public void setBody(final String _body) {
this.body = _body;
}
public String toXML() throws JAXBException {
final JAXBContext context = JAXBContext.newInstance(MyModel.class);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
final StringWriter writer = new StringWriter();
marshaller.marshal(this, writer);
return writer.toString();
}
}
如果我将此写入文件或通过流写入webdav目标,则在使用
ä
作为textvalue时会导致无效的xml。final MyModel m = new MyModel();
m.setBody("\u00E4");
final FileWriter w = new FileWriter("D:\\outtest.xml");
w.write(m.toXML());
w.close();
XMl是这样的(当切换到ansi时,在npp中看起来是另一个,并且在那里正确):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><myModel><body>伯</body></myModel>
我需要一个提示来解决这个问题!
好的,这可以正常工作(谢谢!):
final MyModel m = new MyModel();
m.setBody("\u00E4");
final FileOutputStream s = new FileOutputStream("D:\\outtest.xml");
final OutputStreamWriter osw = new OutputStreamWriter(s, Charset.forName("UTF-8"));
osw.write(m.toXML());
osw.close();
我现在的问题是,此文件测试是简化版本;-)
我调用toXml()并将此字符串写为JPA-moodel。稍后,应使用框架类将其写入webdav,该类将ByteArrayInputStream作为输入。所以我用下面的代码:
final ByteArrayInputStream stream = new ByteArrayInputStream(jpaModel.getXmlString().getBytes());
...然后写下来,我终于明白了。使用“更详细的”
getBytes(Charset.forName("UTF-8"))
可以帮助我!谢谢 最佳答案
好的,现在我们知道您如何编写文件,这就是问题所在:
FileWriter w = new FileWriter("D:\\outtest.xml");
这将始终使用平台默认编码-即使您已经告诉JAXB您将使用UTF-8。有点像为JPEG创建数据,然后将其另存为
.png
文件。使用使用UTF-8包裹在FileOutputStream
中的OutputStreamWriter
,一切都应该很好。如果您使用的是Java 7,则可以简化以下操作:
try (Writer writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
writer.write(m.toXML());
}
或者,您可能想更改您的
toXML
方法以接受一个OutputStream
写入数据,而不是返回一个字符串。