簡體   English   中英

從用Java中的SAX解析的XML屬性值獲取原始二進制數據

[英]Get raw binary data from XML attribute's value parsed with SAX in Java

我正在解析一個包含文本字符串的XML文檔,該文本字符串是從各種輸入文本文件中獲得的,而這些文本文件沒有有關其編碼的信息,這些字符串存儲為屬性值。 XML文檔本身是使用特定的編碼生成的,但是文本字符串作為二進制數據傳遞到XML文檔中,而沒有任何有關其原始編碼是什么的進一步信息。 ASCII值大於127的字符被轉義:

<?xml version="1.0" encoding="ISO-8859-2" ?>
<Root>
  <Value val="&quot;&#xb5;&#xe0;&quot;"/>
</Root>

整個XML文檔均以ISO-8859-2進行編碼,並且元素Value的屬性val的值為:

"µà"

最初以ISO-8859-1編碼,根據PSPad HEX查看器的字節表示為:

22 B5 E0 22

ISO-8859-2中也可以表示為:

"ľŕ"

問題是,我想將其解析為ISO-8859-2 ,但無法從SAX解析器獲取非標准化值。 可以以String對象實例的形式獲取該屬性的值,該對象實例已經將文本表示為:

"µà"

我試圖說服解析器解析ISO-8859-2中的XML,但是沒有任何變化:

XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
MyHandler handler= new MyHandler(); // implementation of DefaultHandler
parser.setContentHandler(handler);
parser.setEntityResolver(handler);
InputStream instream = new FileInputStream("myFile.xml");
InputSource is = new InputSource(instream);
is.setEncoding("ISO-8859-2");
parser.parse(is);

我嘗試將String視為UTF-16並獲取字節,然后使用這些字節創建所需的值:

String val = attributes.getValue("val");
try{
      byte[] bytes = val.getBytes(StandardCharsets.UTF_16);
      ByteBuffer inputBuffer = ByteBuffer.wrap(bytes);
      CharBuffer chData = Charset.forName("ISO-8859-2").decode(inputBuffer);
} catch (UnsupportedEncodingException e) {
      System.out.println("Encoding not supported.")
}

但是我得到的是:

 ţ˙ " ľ ŕ "

分別:

 [-2, -1, 0, 34, 0, -75, 0, -32, 0, 34]

我不確定,如果這種方法是唯一正確的方法,那么如何獲取文本值的原始二進制表示形式。

感謝您的建議。

這個問題與SAX不相關,而僅僅是一個如何將字節數組轉換為ISO-8859-2編碼字符串的問題。 因此,您可以使用如何在Java中將字符串與UTF8字節數組之間來回轉換,以使用一種格式(ISO-8859-1)將字符串從屬性轉換為字節數組,然后從另一種格式(ISO-8859)轉換回字符串。 -2)。

String s = "\"µà\"";
System.out.println(s);
byte[] iso8859_1_bytes = s.getBytes(Charset.forName("ISO-8859-1"));
System.out.println(Arrays.toString(iso8859_1_bytes));
String conv = new String(iso8859_1_bytes, Charset.forName("ISO-8859-2"));
System.out.println(conv);

這將生成以下輸出:

"µà"
[34, -75, -32, 34]
"ľŕ"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM