2013-05-23 6 views
0

Я анализирую XML-файл с помощью анализатора Stax, который имеет кодировку, обозначенную как encoding = "UTF-16", Но фактическое содержимое этого XML-файла не является UTF-16. Как я могу сказать, анализатор Стакса игнорировать кодировку, указанную в файл и делать Автоопределение на основе содержанияКодировка игнорирования Stax игнорировать

ответ

1

В зависимости от того, что метода StAX-Синтаксический вы используете (XMLStreamReader против XMLEventReader), вы можете передать кодировку метод создания XMLInputFactory.

  • createXMLStreamReader (InputStream поток, кодирование String)
  • createXMLEventReader (InputStream поток, кодирование строк)

Если ничего не указано, некоторые реализации STAX пытаются "угадать" фактическое кодирование (WebLogic в StAX- Реализация, например, пытается это сделать), тогда как другие будут использовать стандартную кодировку JVM (System-Property file.encoding; тщательный: должен быть установлен при запуске уже без изменений во время выполнения).

Если вы хотите/должны сами определить кодировку, вам придется реализовать это самостоятельно. Я должен был сделать это один раз и, основываясь на требованиях, спецификациях и окружениях, которые у меня были тогда, закончился небольшим и не очень приятным методом проб и ошибок, когда мне пришлось попробовать все кодировки, которые я поддерживал в своей системе , Один за другим, пока у меня не было достаточно хорошего матча. Я также должен был быть очень осторожным в отношении BOMs (Знаки байтового заказа).

В целом я считаю, что XML-пролог должен содержать правильную кодировку, потому что все, что сделано в коде, может быть только лучше всего (однако это предположение также может быть правильным).

И как личное замечание, это может быть ужасно неправильно, но хорошо работает для меня: поскольку XML в основном является входными данными, я твердо верю в GIGO.

0

Вы можете попробовать что-то вроде этого:

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

     } 
+0

пожалуйста, добавьте хоть немного подробностей о коде, а не только код. – surajsn