Ent*_*opy 1 java xml unicode jaxb
我已经阅读了一些SO答案,说JAXB有一个错误,它归咎于XML的性质,导致它无法使用UTF-8.我的问题是,那么解决方法是什么?我可能会将用户输入的unicode字符复制并粘贴到我需要保存,编组,解组并在其他地方重新显示的数据字段中.
(更新)更多背景信息:
Candidate c = new Candidate();
c.addSubstitution("3 4ths", "\u00BE");
c.addSubstitution("n with tilde", "\u00F1");
c.addSubstitution("schwa", "\u018F");
c.addSubstitution("Sigma", "\u03A3");
c.addSubstitution("Cyrillic Th", "\u040B");
jc = JAXBContext.newInstance(Candidate.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
ByteArrayOutputStream os = new ByteArrayOutputStream();
marshaller.marshal(c, os);
String xml = os.toString();
System.out.println(xml);
jc = JAXBContext.newInstance(Candidate.class);
Unmarshaller jaxb = jc.createUnmarshaller();
ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());
Candidate newCandidate = (Candidate) jaxb.unmarshal(is);
for(Substitution s:c.getSubstitutions()) {
System.out.println(s.getSubstitutionName() + "='" + s.getSubstitutionValue() + "'");
}
Run Code Online (Sandbox Code Playgroud)
这是一个小测试位,我把它们放在一起.我得到的确切字符并非完全由我控制.用户可以将带有波形符号的N粘贴到字段中或其他任何内容.
这是测试代码中的问题:
ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes());
Run Code Online (Sandbox Code Playgroud)
您正在使用平台默认编码将字符串转换为字节数组.不要那样做.您已经指定要使用UTF-8,因此在创建字节数组时必须这样做:
ByteArrayInputStream is = new ByteArrayInputStream(xml.getBytes("UTF-8"));
Run Code Online (Sandbox Code Playgroud)
同样不要使用ByteArrayOutputStream.toString(),它再次使用平台默认编码.实际上,您根本不需要将输出转换为字符串:
ByteArrayOutputStream os = new ByteArrayOutputStream();
marshaller.marshal(c, os);
byte[] xml = os.toByteArray();
jc = JAXBContext.newInstance(Candidate.class);
Unmarshaller jaxb = jc.createUnmarshaller();
ByteArrayInputStream is = new ByteArrayInputStream(xml);
Run Code Online (Sandbox Code Playgroud)
这应该与您正在使用的字符没有问题-它仍然具有无法在XML 1.0表示问题(字符比了其它的U + 0020下方\r,\n并\t),但仅此而已.
| 归档时间: |
|
| 查看次数: |
11997 次 |
| 最近记录: |