Я разбираю 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:
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]
Я не уверен, является ли этот подход единственно правильным подходом к получению исходного двоичного представления текстового значения.
Спасибо за советы.