Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   decodeURI ругается (https://javascript.ru/forum/misc/1987-decodeuri-rugaetsya.html)

Sergey K 15.10.2008 23:31

decodeURI ругается
 
Никак не могу решить следующую задачу:

На странице сайта есть поисковая форма. Серверные скрипты не используются. Надо сделать так, чтобы поисковый запрос, по которому человек, возможно, пришел на сайт, автоматом вставлялся в поисковую форму на сайте. Первое (или не первое, но все равно придется :) ), что надо сделать, привести к вменяемому виду URL реферера. Русский текст, как известно, кодируется. Вот на такой код:
var rf=decodeURI(document.referrer);
,браузер ругается в том смысле, что URI неправильный. decodeURIComponent тоже ругается. Unescape даром что obsolete, не ругается, но все равно фигню чучмекскую выдает. :confused: Нашел скрипт, который парсит window.location, но он корректно работает только если страница UTF-8, а у меня windows-1251.

Кто-нибудь может помочь?

Kolyaj 15.10.2008 23:40

Цитата:

Сообщение от Sergey K
но он корректно работает только если страница UTF-8, а у меня windows-1251.

Важно в какой кодировке страница у поисковика. А способа узнать кодировку я, например, не знаю. Если точно известна кодировка, то http://xpoint.ru/know-how/JavaScript...dows1251IKO I

Infocatcher 16.10.2008 22:59

Лично не проверял, но, возможно, поможет вот это:
http://dark-demon.nm.ru/web/now_how/searcher/

Kolyaj 16.10.2008 23:17

Infocatcher, это к чему вообще?

Infocatcher 17.10.2008 01:33

Эммм... До конца долистали?

Оттуда:
Цитата:

Что если юзер зашел на сайт по ссылке с поисковика? Значит он уже что-то вводил в строку поиска...
[...]
window.onload= function()
{
  var r= parent.document.referrer+"&";
  if (r.search(/[\&\?]text\=(.*)\&/)==-1)
  if (r.search(/[\&\?]q\=(.*)\&/)==-1)
  if (r.search(/[\&\?]words\=(.*)\&/)==-1)
  if (r.search(/[\&\?]query\=(.*)\&/)==-1)
  if (r.search(/[\&\?]search\=(.*)\&/)==-1)
  {};
  document.forms.search.stext.value= unescape(RegExp.$1);
}


Kolyaj 17.10.2008 08:47

Infocatcher, а вы первое сообщение дочитали?
Цитата:

Сообщение от Sergey K
Unescape даром что obsolete, не ругается, но все равно фигню чучмекскую выдает.


Infocatcher 17.10.2008 23:14

Уже не помню :)

Но у меня заработало вот так:
var ref = location.href; // document.referrer;
function getQ(str) {
	var qStr = /[\?&](?:text|q|words|query|search)=([^\?&]*)/.test(ref);
	return qStr && decodeURI(RegExp.$1);
}
alert(getQ(ref));


Проверял через запуск из адресной строки:
javascript: (function() { var ref = location.href; function getQ(str) { var qStr = /[\?&](?:text|q|words|query|search)=([^\?&]*)/.test(ref); return qStr && decodeURI(RegExp.$1); } alert(getQ(ref)); })();


Особо развлекаться было лениво... В общем, в Firefox 2.0+, Opera 9.2+ и IE 6.0, 7.0 все Ok.

К тому же, проблема может быть из-за (кривого) блокирования referer'ов каким-нибудь файрволом. У меня вот они вообще подменяются. :D

[UPD]
А вот с cp1251 – как-то сразу не обратил внимания – действительно траблы...

[UPD – 2]

Полагаю, можно сделать
unescape(qStr)

Потом попытаться перекодировать. Где в результате будет содержаться кириллица
/[а-яё]/i.test(qStr)

, то и использовать. Иначе – брать исходный unescape(qStr).

Kolyaj 17.10.2008 23:50

Infocatcher, проблема в том, что заранее неизвестно, в какой кодировке приходит строка. И вообще говоря, ее распознавание задача нетривиальная.


Часовой пояс GMT +3, время: 11:15.