0

我正在解析一个包含文本字符串的 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);

我尝试将字符串视为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]

我不确定,如果这种方法是唯一正确的方法,如何获得文本值的原始二进制表示。

谢谢你的建议。

4

1 回答 1

0

该问题与 SAX 无关,而只是如何将字节数组转换为 ISO-8859-2 编码字符串的问题。因此,您可以使用How to convert Strings to and from UTF8 byte arrays in Java将字符串从属性转换为使用一种格式 (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]
"ľŕ"
于 2017-10-26T16:16:52.163 回答