Обработка кодировки символов в URI на Tomcat - PullRequest
12 голосов
/ 05 августа 2009

На веб-сайте, с которым я пытаюсь помочь, пользователь может ввести 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 Ответ

5 голосов
/ 05 августа 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...