2015-01-16 36 views
0

我有編碼的多字節字符將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); 

    } 

我試過字符集等,但都無濟於事的許多扭曲的問題;我不斷得到一個輸出

� &#xdc22

這是生成Excel工作簿的應用程序的一部分(* .XLSX)和文件在Excel中打開由於這些字符時失敗。

如何才能實現正確的XML實體?我希望這將由XML庫(原始代碼使用Apache的StringEscapeUtils.escapeXml())來處理。

回答

1

您正在使用的字符串構造函數(new String(byte []))使用平臺默認編碼。嘗試指定編碼在一個替代c-tor(新的字符串(字節[],字符集)或新的字符串(字節[],字符串)

+0

謝謝@瑞安我已經嘗試,但不幸的是,字符串是在XML已被寫入,所以實體已經在這一點上是錯誤的 –

+0

FWIW,如果您將String s更改爲&符號(\ u0026),並將expResult更改爲「&」,則只有在您將編碼傳遞給字符串c- tor(返回新的String(out.toByteArray(),「UTF-16」);)。 – Ryan