Как конвертировать данные из URL в UTF-8?

Занялся вопросом декодирования запросов переданых в URL. Имеется в виду отправка данных скрипту через url при использовании mod_rewrite. Пример работы можете увидеть в на Wikipedia.org. Если мы пишем в адресную строку, или создаём такую ссылку: http://ru.wikipedia.org/wiki/Слово , то движок вики получает “Слово” в url-закодированном виде, раскодирует его и пытается найти в базе это “Слово”.

Знаем, что Вики базируется на utf-8 кодировке, скорей всего база тоже. Но при получении “Слова” в адресной строке оно не будет закодировано в UTF-8 формат. Оно передаётся в формате ASCII (как показывает функция mb_detect_encoding).

Результатом моих иследований стал тот факт, что код привеённый ниже, конвертирует введённый латышский текст (со всеми специфическими (Baltic) символами) в UTF-8 формат.

$word = mb_convert_encoding(urldecode($source_word), "UTF-8", "auto");

Но этот же код не работает для кирилицы – выводит ошибку о недопустимых символах. Для неё необходим такой код:

$word = mb_convert_encoding(urldecode($source_word), "UTF-8", "WINDOWS-1251");

Получается, что если я хочу правильно конвертнуть всё в UTF-8, мне нужно написать такой код:


if(mb_convert_encoding($source_word, "UTF-8", "auto"))
$word = mb_convert_encoding(urldecode($source_word), "UTF-8", "auto");
else
$word = mb_convert_encoding(urldecode($source_word), "UTF-8", "WINDOWS-1251");

Вопросы php-программистам:

  1. От чего зависит кодировка в которой отправляются данные серверу через URL? От сервера, от клиента или это какой-то стандарт? Всё тот же mb_detect_encoding возвращает ASCII и для латышского и для русского языков.
  2. Если параметр “auto” работает для балтийских языков, то работает ли он для западноевропейских языков? А windows-1251 будет ли работать для украинского и беларусского?
  3. Существует ли универсальный код правильно кодирующий данные из URL в UTF-8? Или у той же Вики в базе просто список кодировок на каждый язык?
Дата: 03.09.2007
Категории: PHP
Google     

]]> Денис Радченко ]]>

1. Скорее всего от кодировки страницы зависит. Но в Firefox 2, если передавать URL параметры через JS, то кодировка всегда utf-8

»

]]> Никита ]]>

От кодировки какой страницы? Если я ввожу ручками в адресную строку?

»

]]> Sam ]]>

Зависит от кодировки страницы + от браузера. Всегда можно попользовать JS и сконвертить во что нужно.

Переходите уже на utf-8(как и сделано на wiki) и отпадут почти все проблемы.

»

]]> Никита ]]>

В том, то и дело, что у меня все страницы в utf-8 формате (так же как и на wiki). Но не получаю я данные в utf-8 формате из URL. Они приходят в ASCII для любого языка.

Ещё раз повторяю: НЕ скрипт записывает в адресную строку слова запроса, а пользователь открывает браузер и пишет в адресной строке:
> http: //myserver.com/search/Слово
или
> http: //myserver.com/search/Vārds

»

]]> Sam ]]>

Значит тут дело в браузере и поможет только перекодировка.

Используем iconv.

»

]]> Никита ]]>

попробую iconv. Посмотрю, что он будет мне выдавать.

»

]]> maxic ]]>

А использовать библиотеки функций UTF-8 не пробовали. Я так и поступил, теперь пропала “зависимость” от всего.
Я например использую функции “от” Nasibullin Rinat

»

Напишите комментарий