Обработка кодировки символов в 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? Похоже, сервер должен делать некоторые разумные угадывания. Мы не ожидаем корректной обработки латинского языка 100%, но что-то лучше, чем то, что мы делаем сейчас, предполагая, что все это UTF-8.
Сервер Tomcat 5.5. Поддерживаемые браузеры - IE 6+, Firefox 2+ и Safari на iPhone.
Ответы
Ответ 1
К сожалению, кодировка UTF-8 является "обязательной" в спецификации запись в Википедии имеет хорошую таблицу допустимых и недопустимых байтов).
Менее надежным будет просмотр заголовка "Accept-Charset" в запросе. Я не думаю, что этот заголовок необходим (не проверял спецификацию HTTP для проверки), и я знаю, что Firefox, по крайней мере, отправит целый список допустимых значений. Выбор первого значения в списке может работать, или это может быть не так.
Наконец, проделали ли вы какой-либо анализ журналов, чтобы убедиться, что конкретный пользовательский агент будет последовательно использовать эту кодировку?