[web] русские буквы в URL страниц

tihon972009

Что-то я запутался с URL, содержащими русские буквы...
типа вот таких:
ru.wikipedia.org/wiki/Заглавная_страница
Да, читал про кодирование нелатинских символов в URL.
Вместе с тем, складывается впечатление, что каждый браузер обращается с адресами страниц по-разному: один кодирует, второй не кодирует, третий недокодирует.
Вот такой несложный код:
<?php header("Content-type: text/html; charset=utf-8"); ?>

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang='ru-RU'>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title></title>
</head>
<body>
<script type="text/javascript">
document.write(document.URL);
</script>
</body>

для страницы с адресом (точнее, с куском адреса) вида ф?q=ф дал в трёх браузерах три разных результата:

IE6: ф?q=ф
FF3.0: %D1%84?q=%F4
Chrome4: %D1%84?q=%D1%84
Причем эти результаты от заданной кодировки никак не зависят, являясь, по-видимому, внутренним свойством браузера.
Особенно порадовал фаерфокс. Который символы в части path закодировал как UTF-8, а в части query - как CP-1251 (вообще полный привет, по-моему).
Есть ли цивилизованные средства, которые позволяют привести это к единому виду?

Dasar

для страницы с адресом (точнее, с куском адреса) вида ф?q=ф дал в трёх браузерах три разных результата:
странный результат может объясняться тем, например, что адрес ф?q=ф невалидный (и соответственно: браузеры на невалидный вход выдают невалидный результат)
а должен быть адрес: %D1%84?q=%D1%84

artimon

Для FF посмотри в about:config по слову encode
Вот тебе ещё пища для размышлений, создай другие страницы в разных кодировках (utf-8, windows-1251, koi8-r) на которых поставь ссылку на твою тестовую страницу и перейди по этой ссылке

tihon972009


Для FF посмотри в about:config по слову encode
посмотрел, нашел вот что
network.standard-url.encode-query-utf8;false
одно только не понимаю: почему он тогда запрос кодировует в CP1251? Нет бы вообще не кодировать.. А он кодирует.
И еще. Если в гугле набрать 'ф', а потом скопировать адрес страницы результатов в буфер обмена, то там 'ф' будет закодировано в utf-8. Почему установка из конфига не действует?
Из-за того, что на странице указана кодировка? Так ведь я тоже кодировку на странице указывал...

создай другие страницы в разных кодировках
Да, я сейчас этим и занимаюсь.

tihon972009

Да, это я ввёл руками. Хорошо. Что будет с теми ссылками, которые формируются какими-либо скриптами?
Допустим, я открываю Google и набираю в нём "ф". У меня вопрос: если я нажму на какую-либо ссылку из выдачи, то что я привезу на целевой сайт в referer?
q=ф или q=%D1%84 ? И для всех ли браузеров результат будет одинаковый?
Следует отметить, что адрес страницы результатов поиска в фаерфоксе и хроме выглядит как q=ф, а в IE6 - q=%D1%84
Тут всё осложняется еще и тем, что мне всю эту информацию (url страниц и refererы) нужно собирать со сторонних страниц javascriptовым счетчиком (навроде liveinternetовского который элементы document.URL и document.referer кодирует и пихает в GET-параметры, чтобы передать скрипту...

tihon972009

Да, действительно оказалось, что Firefox кодирует GET-запрос в CP-1251 только когда запрос вводится руками.
Если переходить по ссылкам, то в UTF-8 кодируется и адрес, и сам запрос.
Зачем только сделали опцию network.standard-url.encode-query-utf8 ?
По-моему, она только путаницу вносит...
В хроме всегда кодируется и адрес, и запрос.
Internet Explorer, сука, вообще не кодирует (это шестой; седьмой не знаю - говорят, кодирует всё).
Ну ладно, можно прогонять в любом случае через urldecode, чтобы исходные буквы получить (хотя это жесть, конечно) - если исходные буквы уже есть, то с ними ничего не будет, я так полагаю.

hiper-hoper

Firefox кодирует GET-запрос в CP-1251 только когда запрос вводится руками.
у меня всегда utf-8, чяднт?

apl13

в части path закодировал как UTF-8, а в части query - как CP-1251
Но это, на самом деле ничего, потому что не бывает в UTF-8 букв, начинающихся с 0xF, и любой демон с хотя бы семиклассным образованием с легкостью должен понять, что это восьмибитная кодировка... :ooo:

Dasar

и любой демон с хотя бы семиклассным образованием с легкостью должен понять, что это восьмибитная кодировка...
но останется вопрос на два высших образования - а к какой code page - это восьмибитная кодировка относится?

yolki

у меня все три браузера кодируют в UTF-8.
FF 3.5.7
Opera 10.10
Chrome 4.0.295.0 (35884)

artimon

Пользуешся utf-8 локалью.
В какой-нибудь французской винде запрос закодируется в latin1

tihon972009


у меня всегда utf-8, чяднт?
Тут писали:

Для FF посмотри в about:config по слову encode

tihon972009


и любой демон с хотя бы семиклассным образованием с легкостью должен понять, что это восьмибитная кодировка...
но останется вопрос на два высших образования - а к какой code page - это восьмибитная кодировка относится?
Вот именно!
Короче. Насколько я смог выяснить, картина такая:
Протестированы Chrome 4, FF 3.5, Opera 10.10 и IE6.0 (7 и выше не пробовал).
На предмет обращения с адресом страницы и со строкой referer'а.
IE 6 хранит адрес страницы (т.е. document.URL) в её кодировке (т.е. оставляет его без изменений).
Реферер отправляет в windows-1251 :0
urlencode не делается ни в каком случае.
Все остальные протестированные браузеры переводят часть path (т.е. до знака вопроса) referer'а в UTF-8, после чего весь его кодируют с помощью urlencode.
Chrome и Firefox точно так же хранят и сам адрес страницы.
Opera часть path оставляет без изменений в исходной кодировке страницы (и без urlencode часть query кодирует urlencode.

apl13

Это не на два высших образования, а на три автомата. :p
Оставить комментарий
Имя или ник:
Комментарий: