我正在解析一个包含文本字符串的XML文档,这些文本字符串是从各种输入文本文件中获取的,没有关于其编码的信息,这些文件存储为属性的值。 XML文档本身是使用特定编码生成的,但文本字符串作为二进制数据传递到XML文档中,而没有关于其原始编码的更多信息。 ASCII值大于127的字符将被转义:
<?xml version="1.0" encoding="ISO-8859-2" ?>
<Root>
<Value val=""µà""/>
</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]
我不确定,如果这种方法是唯一正确的方法,如何获得文本值的原始二进制表示。
感谢您的建议。
答案 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]
"ľŕ"