Получить необработанные двоичные данные из значения атрибута XML, проанализированного с помощью SAX в Java
Я анализирую XML-документ, который содержит текстовые строки, полученные из различных входных текстовых файлов без информации об их кодировке, которые хранятся как значения атрибута. Сам документ XML генерируется с определенной кодировкой, но текстовые строки передаются в документ XML в виде двоичных данных без какой-либо дополнительной информации о том, что является их исходной кодировкой. Символы со значением ASCII выше 127 экранируются:
<?xml version="1.0" encoding="ISO-8859-2" ?>
<Root>
<Value val=""µà""/>
</Root>
Весь документ XML закодирован в ISO-8859-2, и значение атрибута val элемента Value равно:
"µà"
Первоначально кодируется в ISO-8859-1, и представление байта в соответствии с PSPad HEX Viewer:
22 B5 E0 22
который также может быть представлен в ISO-8859-2 как:
"ľŕ"
Проблема в том, что я хочу проанализировать его как ISO-8859-2, но из синтаксического анализатора SAX невозможно получить ненормированное значение. Значение атрибута можно получить в виде экземпляра объекта String, который уже представляет текст в виде:
"µà"
Я попытался убедить парсер проанализировать XML в ISO-8859-2, но ничего не изменилось:
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.")
}
но то, что я получаю, это:
ţ˙ " ľ ŕ "
respectivelly:
[-2, -1, 0, 34, 0, -75, 0, -32, 0, 34]
Я не уверен, является ли этот подход единственно правильным, как получить исходное двоичное представление текстового значения.
Спасибо за ваши советы.
1 ответ
Проблема не в SAX, а в том, как преобразовать байтовый массив в кодированную строку ISO-8859-2. Таким образом, вы можете использовать Как преобразовать строки в и из байтовых массивов UTF8 в 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]
"ľŕ"