webew
Войти » Регистрация
 
JavaScript
Протоколы

Русские буквы в адресах страниц

30 декабря 2008, 4:27
Автор: 1234ru
Недавно увидел, что для страниц с адресами http://site.ru/русские_буквы свойство JavaScript document.uri() честно возвращает строку с русскими символами.

В какой кодировке должна быть эта строка?
И что, теперь, получается, для хранения URL в БД latin1 не подходит? (если, например, нужно собирать статистику по чужим страницам, видом адресов которых управлять возможности нет)

Отсюда также и то следствие, что для кодирования адресов в Javascript нужно использовать исключительно encodeURI() или encodeURIComponent(), а не escape() (как это делается, например, в счетчиках liveinternet), которая, как говорится в руководстве по JavaScript, не умеет работать с не-ASCII-символами.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское

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.
30.12.2008, 11:52
Ответить
NO USERPIC

rgbeast

HTTP-запрос не должен содержать не latin1 символов в заголовке запроса. То, что IE показывает русские буквы а адресной строке не значит, что он отправляет такой HTTP-запрос. Проверить легко - обратиться к своему сайту с русской страницей и посмотреть access.log апача.

Вопрос как я понимаю в том, что document.URL, который доступен через JS не является latin1. Например, счетчик liveinternet использует escape(document.URL)
30.12.2008, 12:05
Ответить

bur

rgbeast
То, что IE показывает русские буквы а адресной строке не значит, что он отправляет такой HTTP-запрос.


Я проверил исходящий запрос через ИЕ-bar IEHttpHeaders - уходят какие-то крокозябры (кириллица), но точно не %xx. Через логи проверить надежнее, но пока нет такой возможности...

А вопрос, как мне показалось, был в том, как правильно кодировать URI из яваскрипта (и вообще стоит ли это делать). Ответ: стоит, с помошью encodeURI и encodeURIComponent. Хотя суть вопроса сейчас нам прояснит сам автор темы :-)
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
Ответить
© 2008—2024 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: