从Java

时间:2017-10-26 15:42:49

标签: java sax utf-16 xerces iso-8859-2

我正在解析一个包含文本字符串的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 编码,元素 val 的属性 val 的值为:< / p>

"µà"

最初在 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.")
}

但我得到的是:

 ţ˙ " ľ ŕ "

respectivelly:

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

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

感谢您的建议。

1 个答案:

答案 0 :(得分: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]
"ľŕ"