Декодирования данных из $_GET введённых в строке запроса по-русски

ЕНОТ

Guest
Декодирования данных из $_GET введённых в строке запроса по-русски

Как декодировать строку полученую через $_GET если значение задалось не формой, а в ручную в строке запроса ?

Например:
http://.....local/script.php?str=слово+по+русски
вместо
http://.....local/script.php?str=%f1%eb%ee%e2%ee%2B%ef%ee%2B%f0%f3%f1%f1%ea%e8

urldecode("%f1%eb%ee%e2%ee%2B%ef%ee%2B%f0%f3%f1%f1%ea%e8")
выдаст: слово по русски

а вот urldecode($_GET['srt'])
выдаст: слово РїРѕ СЂСѓСЃСЃРєРё

Конечно можно таблицу перекодировки написать, но хотелось бы это только в крайнем случае делать.
 

Фанат

oncle terrible
Команда форума
руки в строке запроса тут не при чем.
браузер у тебя посылает юникод
причем гарантировать, что так делают все браузеры - нельзя
 

Фанат

oncle terrible
Команда форума
хотя, наверное, можно в заголовках посмотреть кодировку
 

ЕНОТ

Guest
Что-то мне не очень понравилось решение с getallheader (). Взял два броузера один Unicode - Safari, MacOS 10.3.8, другой cp1251 - IE в Win2000Pro), вот отличия которые, как мне кажется, можно было бы использовать:

_SERVER["HTTP_ACCEPT_LANGUAGE"] (ru и en соответственно)
_SERVER["HTTP_USER_AGENT"]

Это как-то не конкретно.

Мне больше нравится определять кодировку строки из $_GET.
На моём сервере не обнаружилось iconv, поэтому я пробую через
на такой код:
PHP:
print "<h1>Проверим ?</h1>";
$encoding1 = mb_detect_encoding ($_GET['a'], "cp1251, UTF-8, UTF-7");
$encoding2 = mb_detect_encoding ($_GET['a'], "UTF-8, UTF-7, cp1251");
$encoding3 = mb_detect_encoding ($_GET['a'], "UTF-7, UTF-8, cp1251");

print "cp1251, UTF-8, UTF-7 => ".$encoding1 ."<br>";
print "UTF-8, UTF-7, cp1251 => ".$encoding2 ."<br>";
print "UTF-7, UTF-8, cp1251 => ".$encoding3 ."<br>";
Результат на Safari, MacOS X:
cp1251, UTF-8, UTF-7 => Windows-1251
UTF-8, UTF-7, cp1251 => UTF-8
UTF-7, UTF-8, cp1251 => UTF-8

Результат на IE, Win2000Pro:
cp1251, UTF-8, UTF-7 => Windows-1251
UTF-8, UTF-7, cp1251 => Windows-1251
UTF-7, UTF-8, cp1251 => Windows-1251

-~{}~ 22.02.05 18:37:

Результат: Mozilla, MacOS X:
cp1251, UTF-8, UTF-7 => UTF-8
UTF-8, UTF-7, cp1251 => UTF-8
UTF-7, UTF-8, cp1251 => UTF-8

Результат Opera 7.5.3, MacOS X:
cp1251, UTF-8, UTF-7 => Windows-1251
UTF-8, UTF-7, cp1251 => UTF-8
UTF-7, UTF-8, cp1251 => UTF-8

Вопрос такой, полагаюсь на ваш опыт.
1. Какие ещё многобайтные кодировки могут выдавать броузеры, хотя бы основная их часть. Всё это нужно для дополнительной функции в поиске, поэтому важно ухватить бОльшую часть, остальные, при желании, наберут запрос в GET форме.

2. Велика ли возможность того, что будет UTF-16, UTF-32, UCS2, UCS4 или ISO-8859-*, написано что mb_detect_encoding в таком случае потерпит фиаско.

3. Если не сложно подскажите чем лучше всего из unicode в win-1251 конвертить ?
Тут - http://ru3.php.net/convert_cyr_string и на форуме предложено куча вариантов, что быстрее и правильнее ? (Apache/1.3.33 (Darwin), PHP/4.3.10, mod_perl/1.26, iconv нет)

P.S (тут уже был - http://phpclub.ru/talk/showthread.php?s=&threadid=60127, http://phpclub.ru/talk/showthread.php?s=&threadid=60356)

Простите, что два сообщения, конец почему-то отбрасывается.

-~{}~ 22.02.05 22:32:

Решил проблему №3 так:

PHP:
function getQuery ($str)
{
	$encoding = mb_detect_encoding ($str, "UTF-8, UTF-7, cp1251");
	
	if (($encoding == "UTF-8") OR ($encoding == "UTF-7"))
	{
		return mb_convert_encoding($str, "cp1251", $encoding);
	} else {
		return $str;
	}
}

print getQuery ($_GET['seachstr']);
Проверял там же, всё работает.
Вопросы 1 и 2 остаются.
 

ZQUALL

Guest
У меня ссылки вписано простыми кирилическими символами, типа /allartist&letter=Ю и по етой переменной потом еще и выборка с базы идёт! Пробовал на ИЕ6 ИЕ5 Опере Файерфоксе и Нетскейпе, без проблем работает.
 

ЕНОТ

Guest
Да, вероятно все броузеры, которые вы пробовали, выдают переменные в cp1251, для Windows это нормально. Но вот, например у меня в MacOS X, в основном все броузеры выдают в Unicode.

А если эта ссылка, делается GET запросом из формы или вообще ссылкой на странице, то она по логике должна быть в той же кодировке, что и сама страница (cp1251 например).

Все танцы с бубном для того, чтобы сделать работающем опцию некоторых броузеров (у меня это плугин Sogudi для Safari, также это есть в Опере). Где запись типа "ya @@@", превращается в "http://www.yandex.ru/yandsearch?text=@@@".
 
Сверху