Я анализирую XML-файл с помощью анализатора Stax, который имеет кодировку, обозначенную как encoding = "UTF-16", Но фактическое содержимое этого XML-файла не является UTF-16. Как я могу сказать, анализатор Стакса игнорировать кодировку, указанную в файл и делать Автоопределение на основе содержанияКодировка игнорирования Stax игнорировать
ответ
В зависимости от того, что метода StAX-Синтаксический вы используете (XMLStreamReader
против XMLEventReader
), вы можете передать кодировку метод создания XMLInputFactory
.
- createXMLStreamReader (InputStream поток, кодирование String)
- createXMLEventReader (InputStream поток, кодирование строк)
Если ничего не указано, некоторые реализации STAX пытаются "угадать" фактическое кодирование (WebLogic в StAX- Реализация, например, пытается это сделать), тогда как другие будут использовать стандартную кодировку JVM (System-Property file.encoding
; тщательный: должен быть установлен при запуске уже без изменений во время выполнения).
Если вы хотите/должны сами определить кодировку, вам придется реализовать это самостоятельно. Я должен был сделать это один раз и, основываясь на требованиях, спецификациях и окружениях, которые у меня были тогда, закончился небольшим и не очень приятным методом проб и ошибок, когда мне пришлось попробовать все кодировки, которые я поддерживал в своей системе , Один за другим, пока у меня не было достаточно хорошего матча. Я также должен был быть очень осторожным в отношении BOMs (Знаки байтового заказа).
В целом я считаю, что XML-пролог должен содержать правильную кодировку, потому что все, что сделано в коде, может быть только лучше всего (однако это предположение также может быть правильным).
И как личное замечание, это может быть ужасно неправильно, но хорошо работает для меня: поскольку XML в основном является входными данными, я твердо верю в GIGO.
Вы можете попробовать что-то вроде этого:
byte[] byteArray = null;
try {
if (something)) {
byteArray = sourceXMLString.getBytes(Constants.ENCODING_UTF_16);
} else {
byteArray = sourceXMLString.getBytes(Constants.ENCODING_ISO_8859_1);
}
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
try {
xmlEventReaderSource = inputFactory.createXMLEventReader(inputStream);
} catch (XMLStreamException e) {
logger.error("ERROR is StAX reader initialization" + e.getLocalizedMessage());
}
пожалуйста, добавьте хоть немного подробностей о коде, а не только код. – surajsn