Палец вверх 1
Перевод
Перевод

Сервлет 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», что, похоже, делает браузер пользователя.

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

java servlets encoding
задан Outlaw Programmer 5 июн. 2009 г., 21:24:21
источник

2 ответа

Палец вверх 1
Перевод
Перевод

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

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

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

ответ дан Thorbjørn Ravn Andersen 5 июн. 2009 г., 21:43:01
источник
Палец вверх 0
Перевод
Перевод

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

ответ дан Will Hartung 5 июн. 2009 г., 21:30:14
источник