Получить необработанные двоичные данные из значения атрибута 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:

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);

Я пытаюсь рассматривать 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.")
}

но я получаю:

 ţ˙ " ľ ŕ "

соответственно:

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

Я не уверен, является ли этот подход единственно правильным подходом к получению исходного двоичного представления текстового значения.

Спасибо за советы.


person WakamaHeja    schedule 26.10.2017    source источник


Ответы (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]
"ľŕ"
person Progman    schedule 26.10.2017
comment
Проблема в том, что ISO-8859-1 не имеет ничего общего со значением. У меня даже нет ссылки на кодировку ISO-8859-1 в рамках всего процесса синтаксического анализа. Единственное, что я знаю, это то, что значение µà следует рассматривать как ISO-8859-2, что возможно, но я не могу заставить синтаксический анализатор обрабатывать XML в этой кодировке. Я думаю, что нормализация значения атрибута приводит к его синтаксическому анализу в экземпляр UTF-16 String. Тем не менее, я благодарю вас за ваш ответ. - person WakamaHeja; 27.10.2017