URLEncode декодирует здесь на сайте ОК, а вот в PHP - не 100%
Например:
Закодированный текст в кодировке UTF-8:
%F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB
URLEncode и URLDecode online дает:
у цыганок волосы
В php 95% раскодируется ок, а вот эта и другие немногие - дают ромбики.
Юзаю Друпал 6, php самый свежий
Куда копать?
Цитата: hidogili
Да, ошибся, строка %F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB в windows-1251, а не в utf
а urldecode() думает, что ее аргумент в utf
Но go.mail.ru (и некот.другие) кодируют урлы в windows-1251
Тогда если есть %D1 - вызывать urldecode()
А иначе - как раскодировать? мне неясно пока
а urldecode() думает, что ее аргумент в utf
Но go.mail.ru (и некот.другие) кодируют урлы в windows-1251
Тогда если есть %D1 - вызывать urldecode()
А иначе - как раскодировать? мне неясно пока
Сначала urldecode(), потом iconv.
По строке нельзя однозначно определить кодировку. Нужно понимать что %D1 - Ñ, %D0 - Ð в windows-1251.
Чтобы раскодировать поисковые запросы нужно иметь базу данных, какая поисковая система в какой кодировке при какой адресной строке работает. Не даром CNStats каждый месяц обновляет словари данных.
ттут
%F3%20%F6%FB%E3%E0%ED%EE%EA%20%E2%EE%EB%EE%F1%FB - это windows-1251.
Русский UTF можно на глаз определить по %D1 и %D1 в каждом нечетном байте (все русские буквы в UTF-8 двухбайтовые)
а urldecode() думает, что ее аргумент в utf
Но go.mail.ru (и некот.другие) кодируют урлы в windows-1251
Тогда если есть %D1 - вызывать urldecode()
А иначе - как раскодировать? мне неясно пока
У меня работает четко, Если что не так - укажите...
Код:
/**
* My helper D6 function: Get search string from Search Engine GET request
*/
function _statistics_ss($referer) {
$ss = ''; $ru_exists = false; $nested_url = false;
if ($referer) {
if (strpos($referer, '%') === false) $ss = substr(strstr($referer, '='),1);
elseif (($i = stripos($referer, '=http://')) !== false) {
$nested_url = true;
$ss = substr($referer, $i+1);
}
else {
$ru_exists = true;
$ss = urldecode(strstr($referer, '%'));
if ($i = stripos($ss, '&q=') !== false) $ss = substr($ss, $i+5);
if (stripos($referer, '%D1') === false && stripos($referer, '%D0') === false)
$ss = iconv("windows-1251", "UTF-8", $ss);
//or equal: $ss = mb_convert_encoding($ss, "UTF-8", "windows-1251");
if (strpos($ss, '%') !== false) // for nested urldecode
$ss = urldecode(strstr($ss, '%')); //by example google.by/imgres?imgurl=...
}
if ((stripos($referer, 'rambler.') !== false) && ($i = strpos($ss, '=')) !== false)
$ss = substr($ss, $i+1); //nova.rambler.ru/search?btnG=Найти!&query=книги...
if (strpos($ss, '&') !== false) // for ya & google
$ss = substr($ss, 0, strpos($ss, '&')); // remove trail params
if ($nested_url) $ss = urldecode($ss);
if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
}
return $ss;
}
* My helper D6 function: Get search string from Search Engine GET request
*/
function _statistics_ss($referer) {
$ss = ''; $ru_exists = false; $nested_url = false;
if ($referer) {
if (strpos($referer, '%') === false) $ss = substr(strstr($referer, '='),1);
elseif (($i = stripos($referer, '=http://')) !== false) {
$nested_url = true;
$ss = substr($referer, $i+1);
}
else {
$ru_exists = true;
$ss = urldecode(strstr($referer, '%'));
if ($i = stripos($ss, '&q=') !== false) $ss = substr($ss, $i+5);
if (stripos($referer, '%D1') === false && stripos($referer, '%D0') === false)
$ss = iconv("windows-1251", "UTF-8", $ss);
//or equal: $ss = mb_convert_encoding($ss, "UTF-8", "windows-1251");
if (strpos($ss, '%') !== false) // for nested urldecode
$ss = urldecode(strstr($ss, '%')); //by example google.by/imgres?imgurl=...
}
if ((stripos($referer, 'rambler.') !== false) && ($i = strpos($ss, '=')) !== false)
$ss = substr($ss, $i+1); //nova.rambler.ru/search?btnG=Найти!&query=книги...
if (strpos($ss, '&') !== false) // for ya & google
$ss = substr($ss, 0, strpos($ss, '&')); // remove trail params
if ($nested_url) $ss = urldecode($ss);
if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
}
return $ss;
}
Код:
/**
* My helper D6 function: Get search string from Search Engine GET request
*/
function _statistics_ss($referer) {
$ss = '';
if ($referer) {
$ru_exists = (strpos($referer, '%') !== false);
if (!$ru_exists) $ss = substr(strstr($referer, '='),1);
else {
$ss = $referer;
if ((stripos($referer, 'yandex.') !== false) // for: images.yandex.ua
&& ($i = strpos($ss, '&text=')) !== false)
$ss = substr($ss, $i+5); // +5, NOT +6 !!!
$ss = str_replace('%E2%98%A0', '', $ss); //for: go.mail.ru !!
if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2);
elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6);
elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5);
elseif (($i = stripos($ss, '%')) !== false) $ss = substr($ss, $i);
$ss = urldecode($ss);
// if obsolete windows-1251 then convert to UTF-8
if ((stripos($referer, '%D1') === false
&& stripos($referer, '%D0') === false)
)
$ss = iconv("windows-1251", "UTF-8", $ss);
}
if ((stripos($referer, 'rambler.') !== false)
&& ($i = strpos($ss, 'query')) !== false)
$ss = substr($ss, $i+6); //nova.rambler.ru/search?btnG=Найти!&query=книги...
if (strpos($ss, '&') !== false) // for ya & google
$ss = substr($ss, 0, strpos($ss, '&')); // remove trail params
// Customize output: Bold for russion strings and red (maroon) for Yandex
if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
}
return $ss;
}
* My helper D6 function: Get search string from Search Engine GET request
*/
function _statistics_ss($referer) {
$ss = '';
if ($referer) {
$ru_exists = (strpos($referer, '%') !== false);
if (!$ru_exists) $ss = substr(strstr($referer, '='),1);
else {
$ss = $referer;
if ((stripos($referer, 'yandex.') !== false) // for: images.yandex.ua
&& ($i = strpos($ss, '&text=')) !== false)
$ss = substr($ss, $i+5); // +5, NOT +6 !!!
$ss = str_replace('%E2%98%A0', '', $ss); //for: go.mail.ru !!
if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2);
elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6);
elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5);
elseif (($i = stripos($ss, '%')) !== false) $ss = substr($ss, $i);
$ss = urldecode($ss);
// if obsolete windows-1251 then convert to UTF-8
if ((stripos($referer, '%D1') === false
&& stripos($referer, '%D0') === false)
)
$ss = iconv("windows-1251", "UTF-8", $ss);
}
if ((stripos($referer, 'rambler.') !== false)
&& ($i = strpos($ss, 'query')) !== false)
$ss = substr($ss, $i+6); //nova.rambler.ru/search?btnG=Найти!&query=книги...
if (strpos($ss, '&') !== false) // for ya & google
$ss = substr($ss, 0, strpos($ss, '&')); // remove trail params
// Customize output: Bold for russion strings and red (maroon) for Yandex
if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
}
return $ss;
}
вырезания поисковой строки из запросов с поисковиков
(где-то 98% русских запросов, так что для английских не отлаживал):
Код:
/**
* My helper D6 function: Get search string from Search Engine GET request
*/
function _statistics_ss($referer) {
$ss = '';
if ($referer) {
$ru_exists = (strpos($referer, '%') !== false);
if (!$ru_exists) $ss = substr(strstr($referer, '='),1);
else {
$ss = $referer;
if ((stripos($referer, 'yandex.') !== false) // for: images.yandex.ua
&& ($i = strpos($ss, '&text=')) !== false)
$ss = substr($ss, $i+5); // +5, NOT +6 !!!
$ss = str_replace('%E2%98%A0', '', $ss); //for: go.mail.ru !!
if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2);
elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6);
elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5);
elseif (($i = stripos($ss, '%')) !== false) $ss = substr($ss, $i);
$ss = urldecode($ss);
// if obsolete windows-1251 then convert to UTF-8
if ((stripos($referer, '%D1') === false
&& stripos($referer, '%D0') === false)
)
$ss = iconv("windows-1251", "UTF-8", $ss);
}
if ((stripos($referer, 'rambler.') !== false)
&& ($i = strpos($ss, 'query')) !== false)
$ss = substr($ss, $i+6); //nova.rambler.ru/search?btnG=Найти!&query=книги...
if (strpos($ss, '&') !== false) // for ya & google
$ss = substr($ss, 0, strpos($ss, '&')); // remove trail params
// Customize output: Bold for russion strings and red (maroon) for Yandex
if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
}
return $ss;
}
* My helper D6 function: Get search string from Search Engine GET request
*/
function _statistics_ss($referer) {
$ss = '';
if ($referer) {
$ru_exists = (strpos($referer, '%') !== false);
if (!$ru_exists) $ss = substr(strstr($referer, '='),1);
else {
$ss = $referer;
if ((stripos($referer, 'yandex.') !== false) // for: images.yandex.ua
&& ($i = strpos($ss, '&text=')) !== false)
$ss = substr($ss, $i+5); // +5, NOT +6 !!!
$ss = str_replace('%E2%98%A0', '', $ss); //for: go.mail.ru !!
if (($i = stripos($ss, 'q=')) !== false) $ss = substr($ss, $i+2);
elseif (($i = stripos($ss, 'query=')) !== false) $ss = substr($ss, $i+6);
elseif (($i = stripos($ss, 'text=')) !== false) $ss = substr($ss, $i+5);
elseif (($i = stripos($ss, '%')) !== false) $ss = substr($ss, $i);
$ss = urldecode($ss);
// if obsolete windows-1251 then convert to UTF-8
if ((stripos($referer, '%D1') === false
&& stripos($referer, '%D0') === false)
)
$ss = iconv("windows-1251", "UTF-8", $ss);
}
if ((stripos($referer, 'rambler.') !== false)
&& ($i = strpos($ss, 'query')) !== false)
$ss = substr($ss, $i+6); //nova.rambler.ru/search?btnG=Найти!&query=книги...
if (strpos($ss, '&') !== false) // for ya & google
$ss = substr($ss, 0, strpos($ss, '&')); // remove trail params
// Customize output: Bold for russion strings and red (maroon) for Yandex
if (!$ru_exists) $ss = '<i>'.$ss.'</i>';
elseif (stripos($referer, 'yandex.') === false) $ss = '<b><i>'.$ss.'</i></b>';
else $ss = '<span style=color:maroon><b><i>'.$ss.'</i></b></span>';
}
return $ss;
}
Почему-то 2 раза отпечаталось - можно удалить первый дубль.