我尝试使用以下代码解码字符串:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.io.IOUtils;
import org.xml.sax.InputSource;
@XmlRootElement(name="Grid")
public class Marshal {
@XmlAttribute(name="Reload", required = false)
public int reload;
@XmlElementWrapper(name="Changes")
@XmlElement(name="I")
public List<XmlAttributeHolder> rowList = new ArrayList<XmlAttributeHolder>();
public static void main(String[] args) {
try {
JAXBContext jc = JAXBContext.newInstance(Marshal.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
// à€
String xmlString = "<Grid><IO/><Changes><I id=\"0\" Changed=\"1\" STT=\"à&#8364;\"/></Changes></Grid>";
InputStream inputStream = IOUtils.toInputStream(xmlString);
InputSource is = new InputSource(inputStream);
is.setEncoding("ISO-8859-1");
Marshal obj = (Marshal) unmarshaller.unmarshal(is);
System.out.println(xmlString);
for (int i=0;i<obj.rowList.size();i++) {
XmlAttributeHolder xah = obj.rowList.get(i);
System.out.println(xah.getAttrMap());
for (String formValue:xah.getAttrMap().values()) {
System.out.println(StringEscapeUtils.unescapeXml(formValue));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static class XmlAttributeHolder {
@XmlAnyAttribute
public Map<QName, String> attrMap = new HashMap<QName, String>();
public void addAttribute(String name, String value) {
attrMap.put(QName.valueOf(name), value);
}
public String getAttribute(String name) {
return attrMap.get(QName.valueOf(name));
}
public Map<QName, String> getAttrMap() {
return attrMap;
}
}
}
我尝试在 Java 1.6 窗口中运行此代码并给出正确答案:
0
1
à€
当我尝试在 IBM java 1.6 CentOS 中运行此代码时给出了错误的答案:
0
1
à €
为什么解码指令不能正确转换 à(甚至 èéìòù...)?
最佳答案
如果您的输入实际上是一个 String
,我建议将其直接传递给 Unmarshaller
,包装在 StringReader
中,而不是尝试从中生成一个 InputStream
。它不太容易出错。
试试这个(见下面的代码片段)。这样您就不必担心您的代码是否指定了正确的编码或是否针对该编码正确地将字符转换为字节。
String xmlString = "<Grid><IO/><Changes><I id=\"0\" Changed=\"1\" STT=\"à&#8364;\"/></Changes></Grid>";
InputSource is = new InputSource(new StringReader(xmlString));
Marshal obj = (Marshal) unmarshaller.unmarshal(is);
关于java解码à的错误转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35337563/