Недавно увидел, что для страниц с адресами http://site.ru/русские_буквы свойство JavaScript document.uri() честно возвращает строку с русскими символами.
В какой кодировке должна быть эта строка?
И что, теперь, получается, для хранения URL в БД latin1 не подходит? (если, например, нужно собирать статистику по чужим страницам, видом адресов которых управлять возможности нет)
Отсюда также и то следствие, что для кодирования адресов в Javascript нужно использовать исключительно encodeURI() или encodeURIComponent(), а не escape() (как это делается, например, в счетчиках liveinternet), которая, как говорится в руководстве по JavaScript, не умеет работать с не-ASCII-символами.
Русские буквы в адресах страниц
30 декабря 2008, 4:27
Автор: 1234ru
|
|
burВо-первых я не очень понял насчет метода uri() объекта document:1234ru document.uri() честно возвращает строку с русскими символами В JavaScript-сценарии такая запись должна приводить к ошибке, имхо. Теперь насчет кодировок в URI: Все элементы URI должны состоять только из символов базовой латиницы. Для того, чтобы включить в них другие символы (например, при передаче CGI-сценарию запроса на поиск русской фразы), следует преобразовать каждый символ, не принадлежащий к базовой латинице, в формат UTF-8, и полученные байты представить в виде %xx, где xx — шестнадцатеричный код байта. Например, символ тильда ("~") должен быть представлен как %7e. Программы, которые формируют URI ресурсов в виде текстовых строк, должны кодировать URI согласно описанным правилам перед тем, как передавать их любому протоколу Интернета, и декодировать их после получения. И как ты правильно заметил: Метод encodeURI выполняет стандартную кодировку URI. При этом он не кодирует символы ":", "/", ";" и "?", считая их стандартными разделителями URI. Для кодировки этих символов следует пользоваться методом encodeURIComponent. Тем не менее ссылки с кириллицей действительно имеют место в рунете, например: http://yandex.ru/yandsearch?text=пиво Дальнейшее поведение зависит от браузера, например FF2 до отправки запроса преобразует значение get-параметра в стандартную кодировку URI: http://yandex.ru/yandsearch?text=%EF%E8%E2%EE Internet Explorer, судя по исходящему запросу, не занимается преобразованием символов к %xx. В результате в адресной строке мы продолжаем видеть "пиво". Почему это понимает сервер нам возможно смогут пояснить знатоки протокола HTTP. Значит не только ASCII-символы могут встречаться в заголовках запроса? Методом escape для URI-преобразования лучше не пользоваться: Метод escape преобразует входную строку в шестнадцатеричную кодировку Unicode. При этом все символы, не являющиеся символами базовой латиницы, заменяются на их шестнадцатеричные escape-коды %xx. Если код символа больше 255, то он заменяется на %uxxxx. Например, оператор document.write(escape("Строка.")) выведет на экран обозревателя строку %u0421%u0442%u0440%u043E%u043A%u0430.
Примечания. Эта функция не должна использоваться для стандартной кодировки строк, содержащих URI. Вместо нее следует использовать методы encodeURI и encodeURIComponent. Обратное преобразование строки производится методом unescape. Fastcoder.org — портал для JavaScrpt-программистов
|
30.12.2008, 11:52 Ответить |
|
NO USERPIC
|
rgbeastHTTP-запрос не должен содержать не latin1 символов в заголовке запроса. То, что IE показывает русские буквы а адресной строке не значит, что он отправляет такой HTTP-запрос. Проверить легко - обратиться к своему сайту с русской страницей и посмотреть access.log апача.Вопрос как я понимаю в том, что document.URL, который доступен через JS не является latin1. Например, счетчик liveinternet использует escape(document.URL) |
30.12.2008, 12:05 Ответить |
|
|
burrgbeast То, что IE показывает русские буквы а адресной строке не значит, что он отправляет такой HTTP-запрос. Я проверил исходящий запрос через ИЕ-bar IEHttpHeaders - уходят какие-то крокозябры (кириллица), но точно не %xx. Через логи проверить надежнее, но пока нет такой возможности... А вопрос, как мне показалось, был в том, как правильно кодировать URI из яваскрипта (и вообще стоит ли это делать). Ответ: стоит, с помошью encodeURI и encodeURIComponent. Хотя суть вопроса сейчас нам прояснит сам автор темы :-) Fastcoder.org — портал для JavaScrpt-программистов
|
30.12.2008, 12:14 Ответить |
|
NO USERPIC
|
rgbeastЧерез лог проверить проще простого (мне правда пришло грузить ноут с виндой для этого). Обратился к webew.ru/testuri/тестПолучил такую запись в логе. 113.241.251.84 - - [30/Dec/2008:12:40:14 +0300] "GET /testuri/%D1%82%D0%B5%D1%81%D1%82 HTTP/1.1" 404 7271 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)" Кстати, для просмотра нужной записи в логе использовалась юникс-команда cat /home/webew.ru/logs/access.log | grep testuri | head -1 (подробности будут в курсе администрирования линукс, который сейчас в разработке) На самом деле HTTP - протокол, который соблюдается в инете очень на высоком уровне. |
30.12.2008, 12:42 Ответить |
© 2007—2010 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.