Получить необработанные двоичные данные из значения атрибута XML, проанализированного с помощью SAX в 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, и значение атрибута 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]
"ľŕ"
Другие вопросы по тегам