Обработка кодировки символов в URI на Tomcat

На веб-сайте, с которым я пытаюсь помочь, пользователь может ввести URL-адрес в браузере, например, после китайских символов,

  http://localhost:8080?a=测试

На сервере мы получаем

  GET /a=%E6%B5%8B%E8%AF%95 HTTP/1.1

Как видите, кодируется UTF-8, а затем URL. Мы можем справиться с этим правильно, установив кодировку UTF-8 в Tomcat.

Однако иногда мы получаем кодировку Latin1 в некоторых браузерах,

  http://localhost:8080?a=ß

превращается в

  GET /a=%DF HTTP/1.1

Есть ли в любом случае, чтобы справиться с этим правильно в Tomcat? Похоже, сервер должен сделать некоторые умные предположения. Мы не ожидаем, что с Latin1 правильно справимся на 100%, но все лучше, чем то, что мы делаем сейчас, предполагая, что все в UTF-8.

Сервер Tomcat 5.5. Поддерживаются следующие браузеры: IE 6+, Firefox 2+ и Safari на iPhone.

1 ответ

Решение

К сожалению, кодировка UTF-8 является "следует" в спецификации URI, которая, по-видимому, предполагает, что исходный сервер будет генерировать все URL-адреса таким образом, что они будут значимыми для конечного сервера.

Есть несколько методов, которые я бы рассмотрел; все они включают в себя синтаксический анализ строки запроса самостоятельно (хотя вы можете лучше меня знать, влияет ли установка кодировки запроса на строку запроса на сопоставление параметров или только на тело).

Сначала проверьте строку запроса на наличие "старших байтов": допустимая последовательность UTF-8 должна иметь два или более байтов (в записи Википедии имеется хорошая таблица действительных и недействительных байтов).

Менее надежным будет поиск заголовка "Accept-Charset" в запросе. Я не думаю, что этот заголовок необходим (я не проверял спецификации HTTP для проверки), и я знаю, что Firefox, по крайней мере, отправит целый список допустимых значений. Выбор первого значения в списке может сработать, а может и нет.

Наконец, вы провели какой-либо анализ журналов, чтобы увидеть, будет ли конкретный пользовательский агент последовательно использовать эту кодировку?

Другие вопросы по тегам