LINUX.ORG.RU

Кодирование параметров, передаваемых через URL


0

0

Доброго времени суток!

Нахожусь в некоторых непонятках насчет того, как кодировать строки не-ASCII символов (русские, например) при передаче их как параметров URL. Использовал escape, который такие символы кодирует в виде %uXXX, но в Safari наткнулся на проблему: Сафари зачем-то кодирует такую строку еще раз и на сервере, естественно, я получаю не то, что нужно.

Почитал, что об этом пишут на просторах сети, узнал про encodeURIComponent/decodeURIComponent. Т.к. все страницы в UTF-8, решил использовать эти функции (правда, их нет в IE 5.0, совместимость с которым я должен обеспечить, там решил по-прежнему использовать escape). Сделал реализацию этих функций на сервере (т.к. часть URL-ей формируется там и передается на клиент либо в HTML-е, либо в JS-коде).

Но потом столкнулся такой штукой: если я готовлю URL на сервере и кодирую его параметры encodeURIComponent, а потом закладываю результат в HTML (или даже делаю все на клиенте, но результат записываю как-то так: a.href = "javascript:func('" + url + "');";), то браузер раскодирует URL (под IE получаются кракозябры, под Сафари - просто исходные значения параметров). Поэтому приходится перед такой записью делать encodeURI на весь URL. Можно, конечно, найти теперь все места, где в HTML закладываются URL-и и везде добавить добавочное кодирование, реализовав на сервере encodeURI, но как-то это грустно.

Подскажите, пожалуйста, есть какое-нибудь руководство по таким вещам, где подобные грабли описываются для разных браузеров (IE 5.0+, Firefox 1.5+, Opera, Safari)? Или просто выскажите мнение на проблему.

anonymous

А зачем тебе эти заниматся? Пиши прямо эти свмые символы, а браузер пусть кодирует.

Или речь о спец-символах?

zzandy
()
Ответ на: комментарий от zzandy

В том числе речь и о специальных символах. Например, параметром может быть другой URL. Или параметром может быть строка вида "слово1 & слово2".

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

anonymous
()

Сходи на w3.org и поищи по URI encode. Все описано и это стандарт. + Перечитай описалово настроек под Сафари. Браузер по замыслу сам должен кодировать запрос в корректный вид. НО! Если ты в хтмл отдаешь некорректный URI, то и запрос браузера будет таким же.

gh0stwizard ★★★★★
()
Ответ на: комментарий от gh0stwizard

Ну, судя по W3C, все, что не-ASCII, должно кодироваться в UTF-8, а потом полученные символы должны кодироваться в виде %XX. Тогда encodeURI и encodeURIComponent действуют по стандарту.

Браузер в данном случае не формирует URL - все взаимодействие с сервером идет через AJAX и URL-и формируются либо в браузерных скриптах, либо на сервере.

Так вот, не очень понятно, почему в результате выполнения такой (например) штуки:

a.href = "javascript:navigate('" + url + "')";

url (которую сформировали в готовом для передачи виде, с помощью encodeURIComponent) при попадании в a.href раскодируется и чтобы в функцию navigate попадала правильное значение, нужно еще пропустить url через encodeURI перед конкатенацией строк.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.