Вы, похоже, используете IBM437
в качестве канонического имени или псевдонима кодировки, и в соответствии с той же страницей, с которой вы связались , она не указана в качестве действительного имени или псевдонима. Вместо этого в списке указывается IBM-437
, которое выглядит как правильное имя, и вы должны указать его вместо этого.
Я не вижу ни одного кода, размещенного в вопросе, который использует в коде литерал String IBM437
, и, следуя стековой трассировке, я подозреваю, что вы указали это в JSP (который компилируется в сервлет, который использует движок Jasper) либо в атрибуте pageEncoding
, либо в атрибуте contentType
директивы page
. Таким образом, вы должны заменить IBM437
на IBM-437
в JSP и перекомпилировать его.
Кроме того, вы не указали, должен ли ваш проект использовать набор символов IBM-437
. Я подозреваю, что набор символов IBM-437
используется из-за одного из нескольких системных свойств, таких как file.encoding
, установленного на IBM-437
. Если вы не намереваетесь использовать IBM-437
, вам следует начать рассматривать использование канонического имени или псевдонима, такого как UTF-8, во всем коде, чтобы ваше приложение не имело никаких неуместных предположений относительно набора символов входных данных или выходные ответы, с которыми он имеет дело.
Обновленный ответ
На основании новой трассировки стека и отправленного кода можно вывести следующее:
- Вы используете TrueZIP 6. Это важно в некотором смысле, поскольку основная причина, по которой требуется поддержка набора символов
IBM437
в вашей JRE, связана с базовым требованием кодирования записей в файле ZIP с использованием IBM437
набор символов , также известный как CP437
.
- Текущая рабочая среда JRE и не поддерживает набор символов
IBM437
в любой форме . Обратите внимание на акцент в предыдущей строке. Очевидно, TrueZIP 6 поставляется с поддержкой IBM437
, хотя JRE может не поддерживать этот набор символов. TrueZIP использует концепцию SPI-провайдера в Java NIO, которая доступна с Java 1.4 для поддержки дополнительных кодировок, которые изначально не поддерживаются JRE; в данном конкретном случае набор символов IBM437
поддерживается с помощью класса de.schlichtherle.nio.charset.IBM437Charset
, который должен присутствовать в вашем файле truezip-6.jar. Файл JAR также должен содержать следующий файл: META-INF/services/java.nio.charset.spi.CharsetProvider
с содержимым de.schlichtherle.nio.charset.spi.CharsetProvider
(т. Е. Поставщик кодировки, встроенный в TrueZIP, который регистрирует класс IBM437Charset
).
На основании вышеизложенного следует проверить следующее:
- Может ли загрузчик классов веб-приложения искать поставщика кодировок, встроенного в TrueZIP? Это важно, так как базовый JRE (я предполагаю, что это Sun JRE 1.4.2_x) не поддерживает набор символов
IBM437
, а TrueZIP полагается на поставщика встроенного набора символов для поддержки набора символов IBM437
. Так как CharsetProvider
ищутся с использованием загрузчика классов контекста текущего потока (отмеченного в документации CharsetProvider
Java API), невозможность загрузить TrueZIP CharsetProvider
приведет к выбросу InconsistentCharsetSupportError
. В большинстве веб-приложений контекстный загрузчик классов текущего потока также оказывается загрузчиком классов веб-приложения (который загружает классы из WEB-INF\lib
и WEB-INF\classes
), но это не всегда так. В случае, если загрузчик классов контекста не является загрузчиком классов веб-приложения, вы должны поместить файл truezip-6.jar
в путь к классам загрузчика классов контекста вместо WEB-INF \ lib.
- Вы можете проверить, произошла ли ошибка при загрузке реализации TrueZIP
CharsetProvider
, запустив ваш код в автономной JRE (из командной строки) вместо запуска в веб-приложении; не забудьте поместить truezip-6.jar в путь к классу приложения. - Рассмотрите возможность размещения truezip-6.jar в каталоге расширений (
<jre>/lib/ext
) JRE, используемой контейнером веб-приложения. Это следует делать только в том случае, если вы не можете получить загрузчик класса текущего контекста для загрузки TrueZIP CharsetProvider
, и только когда вы убедились, что проблема заключается в загрузке CharsetProvider
.