parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Кодировки запросов, нестыковки

G_Z 11.02.2008 10:28

Всё же решил создать ветку.
Кто умный, кого достало, кто считает это всё ненужной фигнёй — просьба не писать.
Слышал, знаю.

Я, как нормальный дурень, хочу в этом разобраться.

Итак, имеем:
1. Сайт в UTF, введённый урл rewrite'ится как поле «url», на index.html.
2. Браузер.
3. Ввод в адресную строку запроса вида «Тест» (любая кириллица).

Сайт работает полность в UTF.
Во время работы формируется XML, который трансформируется в HTML.
В XML выдаются разные служебные поля, в том числе, поля формы (именно формы, а не request:query).

Сайт отдаёт всё в UTF, потому
$response:charset[UTF-8]
Сайт ожидает данных в UTF, потому
$request:charset[UTF-8]
И вот в адресную строку пользователем вбивается кириллица.
Причины, по которым это происходит могут быть разные: на сайте используются «кириллические» URL'ы, пользователю не фиг делать, пользователь ошибся.
Также это может быть кривая внешняя ссылка.

Эмпирическим путём выявлено следующее поведение браузеров в подобных ситуациях: в зависимости локализации ОС/браузера и(ли) настроек браузер энкодит кириллицу в некую кодировку.
Как показывается практика, для нас, чаще всего, это WIN.

Таким образом, запрос «http://site/Тест» превращается в «http://site/%f2%e5%f1%f2/» (IE, FF).
В силу рерайта, такой URL аналогичен «http://site/?url=%f2%e5%f1%f2/».

Как помним, сайт ожидает прихода запроса в UTF, Парсер честно считает пришедшее юникодом и перекодировку не производит.
Как видим, приходит туда WIN.

И если в request:query у нас лежит энкоденный вариант «%f2%e5%f1%f2/», то данные формы Парсер из кодов переводит в символы.
В поле формы оказывается текст в кодировке WIN, но считается она за UTF.

В результате, при попытке xdoc::create имеем ошибку «Input is not proper UTF-8, indicate encoding».

Подобная ситация с нестыковкой ожидаемой и фактической кодировок может произойти и в других случаях.

Браузер никаких заголовков, позволяющих опознать кодировку при таком запросе не отсылает.

Согласен, что в этом полностью виноват клиент, заславший неверный запрос.
Однако, нельзя на подобных запросах падать, гораздо правильнее опознать кодировку и сделать редирект на верный URL.
Либо, в случае поста формы, нормально обработать данные, если это возможно.

Нельзя давать ронять сайт элементарным действием.

Можно, конечно и сказать, что «запрос не опознан», но для правильной обработки подобной ошибки нужно опознать кодировку запроса и быть уверенным что она не та, что ожидалось.

Вариант решения вижу ровно один: опознать кодировку запроса и переключить $request:charset в опознанную кодировку.
Тогда Парсер сделает всё сам (если такую кодировку знает) и всё будет красиво.
Другой вариант — заставить сервер самостоятельно делать то же самое, чтобы Парсер получал всё в UTF.

Собственно вопрос: как опознать кодировку?
Либо, возможно ли соответствующая настройка сервера? Пока ничего подобного в сторону «от пользователя» на глаза не попалось.

Может я чего не понимаю и можно сделать что-то ещё?..

Буду рад любой помощи.