Проблема с кодировкой парсера Xerces Sax2

У меня есть класс парсера Sax, который используется в приложении Swing и в веб-проекте, развернутом в GlassFish.

Класс анализирует xml-файлы. Он отлично работает в приложении Swing IDE Netbeans (в IDE) и веб-проекте.

Но когда я очищаю и собираю приложение Swing в один .jar, оно больше не распознает такие символы, как ī, ķ, ļ, ā из XML-файла.

Та же проблема возникает, если я компилирую и запускаю ее через cmd.

Была такая же проблема в веб-проекте - отсортировано с использованием конфигурации Glassfish.

Вопрос в том, как решить эту проблему в приложении для свинга?

вот кусок кода:

public void parseDocument(String filePath) {

    try {
        XMLReader xr = XMLReaderFactory.createXMLReader();
        xr.setContentHandler(this);
                    InputSource is = new InputSource(new FileReader(filePath));
                    is.setEncoding("UTF-8");
        xr.parse(is);

    }catch(SAXException se) {
        se.printStackTrace();
    }catch (IOException ie) {
        ie.printStackTrace();
    }
}

Никакой помощи от метода setEncoding().


person sergej.art    schedule 01.07.2011    source источник
comment
В командной строке вы можете использовать JVM, которую Netbean использует для запуска вашего jar-файла? У меня возникла проблема, когда одна JVM нормально выполняет мой код, а другая — нет из-за базовой реализации XMLReader. Мир!   -  person Alvin    schedule 01.07.2011
comment
Спасибо, Элвин, что ты послал меня искать решение в правильном направлении.   -  person sergej.art    schedule 02.07.2011
comment
@ sergej.art, если вам нравится ответ, не забудьте проголосовать за него и, возможно, даже принять его.   -  person Paul Wagland    schedule 21.07.2011


Ответы (2)


Вы уже ответили на свой вопрос, однако другой способ справиться с этим - явно установить преобразование при открытии файла.

public void parseDocument(String filePath) {
  try {
    XMLReader xr = XMLReaderFactory.createXMLReader();
    xr.setContentHandler(this);
    Reader reader = new InputStreamReader(new FileInputStream(filePath);
    InputSource is = new InputSource(reader, "UTF-8");
    is.setEncoding("UTF-8");
    xr.parse(is);
  }catch(SAXException se) {
    se.printStackTrace();
  }catch (IOException ie) {
    ie.printStackTrace();
  }
}

Большая разница между этим и вашим решением в вопросе заключается в том, что мы используем InputStreamReader поверх FileInputStream. Согласно javadoc для FileReader, он всегда открывает файл в «наборе символов по умолчанию», поэтому ваше решение работает, поскольку вы меняете набор символов по умолчанию. Вы также можете явно указать, в каком наборе символов вы хотите открыть файл, но для этого вам нужно использовать комбинацию InputStreamReader и FileInputStream.

person Paul Wagland    schedule 02.07.2011
comment
@ sergej.art, если вам нравится ответ, не забудьте проголосовать за него и, возможно, даже принять его. - person Paul Wagland; 04.07.2011

Отвечая на мой собственный вопрос.

Проблема была с настройками JVM.

Я добавил новую переменную в системные переменные Windows:

Variable name:JAVA_TOOL_OPTIONS
Variable value: -Dfile.encoding=UTF8

Работает отлично.

person sergej.art    schedule 02.07.2011
comment
вы уверены насчет UTF8? Для меня это кажется не правильным. Может UTF-8? - person Artem Konovalov; 08.11.2018