多字节字符XML实体

时间:2015-01-16 16:44:18

标签: java xml

我在将多字节字符编码为XML文档时遇到问题

import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

public class XmlWriter {
    static final XMLOutputFactory outputFactory = XMLOutputFactory.newFactory();
    static XMLStreamWriter streamWriter;

    public static String Write(String s) throws XMLStreamException, UnsupportedEncodingException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        streamWriter = outputFactory.createXMLStreamWriter(out, "utf-16");
        streamWriter.writeCharacters(s);
        streamWriter.flush();
        return new String(out.toByteArray());
    }
}


public class XmlWriterTest extends TestCase {

    public void testWrite() throws Exception {
        System.out.println("Write");
        String s = "\uD803\uDC22";
        String expResult = "𐰢";
        String result = XmlWriter.Write(s);
        assertEquals(expResult, result);

    }

我尝试了许多扭曲的charsets等但无济于事;我一直得到

的输出
  

&安培;#xd803;&安培;#xdc22

这是生成Excel工作簿(* .xlsx)的应用程序的一部分,并且由于这些字符而在Excel中打开文档时失败。

如何才能实现正确的XML实体?我希望这可以由XML库处理(原始代码使用Apache的StringEscapeUtils.escapeXml())。

1 个答案:

答案 0 :(得分:1)

您正在使用的字符串构造函数(new String(byte []))使用平台默认编码。尝试在备用c-tor中指定编码(new String(byte [],Charset)或new String(byte [],String)