java解码à的错误转换

标签 java jaxb centos escaping unmarshalling

我尝试使用以下代码解码字符串:

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=\"à&amp;#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=\"à&amp;#8364;\"/></Changes></Grid>";
InputSource is = new InputSource(new StringReader(xmlString));
Marshal obj = (Marshal) unmarshaller.unmarshal(is);

关于java解码à的错误转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35337563/

相关文章:

java - 具有可变数量 @XMLElements 的 JAXB

java - 解码 Web 服务响应时出错

linux - bash 脚本将字符串视为命令

php - 无法将文件从 PHP 上传到 Centos 服务器?

java - 用eclipse升级软件后出错

java - 数据流不同转换示例

java - 没有注释的 JAXB Unmarshal

docker - 请等待....对于第一个基于 docker 的 Jenkins 引导

Java ArrayList 搜索和删除

java - 线程中的某些代码不重复