簡體   English   中英

Jaxb編組到錯誤的角色

[英]Jaxb marshalling to wrong character

我曾經通過調用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目標,它采用即當導致了無效的XML ä作為textvalue。

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>

我需要一個提示來解決這個問題!


OK,這可以正常工作(謝謝!):

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包裝在OutputStreamWriterFileOutputStream ,一切都應該很好。

如果您使用的是Java 7,則可以簡化以下操作:

try (Writer writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8)) {
    writer.write(m.toXML());
}

另外,您可能希望更改toXML方法以接受將數據寫入其中的OutputStream ,而不是返回字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM