Сервлет Java: как обрабатывать неизвестные кодировки?

Когда определенный пользователь пытается просмотреть нашу веб-страницу, при вызове response.getWriter () выдается исключение NullPointerException с сообщением charsetName. Я декомпилировал класс ответа нашего веб-сервера (JRun 3.1) и обнаружил, что эта ошибка возникает, когда он делает следующее:

s = getCharacterEncoding(); // returns 'x-mac-roman' I believe
try
{
    outWriter.exchangeWriter(new OutputStreamWriter(bufStream, s));
}
catch(UnsupportedEncodingException unsupportedencodingexception)
{
    s = MIME2Java.convert(s); // looks like this returns null
    outWriter.exchangeWriter(new OutputStreamWriter(bufStream, s)); // NPE!!!
}

Я наконец смог воспроизвести эту ошибку, когда заставил свой браузер отправить заголовок запроса «Accept-Charset = x-mac-roman, utf-8», что, по-видимому, и делает браузер пользователя.

Это код веб-сервера, поэтому я не могу вносить здесь какие-либо изменения, но мы можем кое-что сделать со своей стороны, чтобы этого никогда не произошло. Можем ли мы явно заставить веб-сервер использовать определенную кодировку и не оставлять это на усмотрение запросов?


person Outlaw Programmer    schedule 05.06.2009    source источник


Ответы (2)


MacRoman - это «международный набор символов», который не всегда устанавливается установщиком Sun Java и, следовательно, недоступен для программ.

Согласно http://java.sun.com/javase/6/docs/technotes/guides/intl/encoding.doc.html не выполняется, если программа установки определяет, что это «европейская» операционная система.

Если вы переустанавливаете Sun Java и запрашиваете поддержку для неевропейских языков в настроенной установке, это следует исправить.

person Thorbjørn Ravn Andersen    schedule 05.06.2009

Вы можете создать фильтр и новый запрос (используя оболочку запроса), который всегда отвечает «допустимой» кодировкой символов для сортированных значений «действительный». Фактически, это то, что они пытаются сделать с помощью вызова MIME2Java.convert (), но вам придется сделать это «раньше» и перехватить это, чтобы лучше контролировать кодировку.

person Will Hartung    schedule 05.06.2009