Я только начал учить javascript, и это мой первый скрипт, написанный от начала до конца самостоятельно, без копипаста из учебников.
Пытался вычленить поисковые запросы из document.referrer для посетителей, пришедших с поисковиков. И столкнулся с такой проблемой: некоторые поисковики кодируют эти запросы не unicode, а в win-1251 (например, вот запрос "
текст" в cp1251, полученный с mail.ru:
%F2%E5%EA%F1%F2, а вот тот же запрос в utf-8 с yandex.ru:
%D1%82%D0%B5%D0%BA%D1%81%D1%82). Соответственно, нужно перекодировать в юникод. Долго помучившись, нашел решение. Функция принимает строку с куском url в cp1251 (как отдает mail.ru) и возвращает строку с тем же значением в юникоде (как отдал бы яндекс). На красоту сей скрипт не претендует, но свое дело делает. Заодно написал такую же функцию для перекодирования из koi-8 в utf-8, хотя сайтов, передающих url-ы с такой кодировкой, я не встречал.
Любые комментарии приветствуются, особенно конструктивные советы.
function win2uni(txt) {
var w2u = {
// [url]http://msdn.microsoft.com/ru-ru/goglobal/cc305144%28en-us%29.aspx[/url]
"%80":"\u0402",
"%81":"\u0403",
"%82":"\u201A",
"%83":"\u0453",
"%84":"\u201E",
"%85":"\u2026",
"%86":"\u2020",
"%87":"\u2021",
"%88":"\u20AC",
"%89":"\u2030",
"%8A":"\u0409",
"%8B":"\u2039",
"%8C":"\u040A",
"%8D":"\u040C",
"%8E":"\u040B",
"%8F":"\u040F",
"%90":"\u0452",
"%91":"\u2018",
"%92":"\u2019",
"%93":"\u201C",
"%94":"\u201D",
"%95":"\u2022",
"%96":"\u2013",
"%97":"\u2014", // "%98" is omitted: it is reserved by windows and can't be used
"%99":"\u2122",
"%9A":"\u0459",
"%9B":"\u203A",
"%9C":"\u045A",
"%9D":"\u045C",
"%9E":"\u045B",
"%9F":"\u045F",
"%A0":"\u00A0",
"%A1":"\u040E",
"%A2":"\u045E",
"%A3":"\u0408",
"%A4":"\u00A4",
"%A5":"\u0490",
"%A6":"\u00A6",
"%A7":"\u00A7",
"%A8":"\u0401",
"%A9":"\u00A9",
"%AA":"\u0404",
"%AB":"\u00AB",
"%AC":"\u00AC",
"%AD":"\u00AD",
"%AE":"\u00AE",
"%AF":"\u0407",
"%B0":"\u00B0",
"%B1":"\u00B1",
"%B2":"\u0406",
"%B3":"\u0456",
"%B4":"\u0491",
"%B5":"\u00B5",
"%B6":"\u00B6",
"%B7":"\u00B7",
"%B8":"\u0451",
"%B9":"\u2116",
"%BA":"\u0454",
"%BB":"\u00BB",
"%BC":"\u0458",
"%BD":"\u0405",
"%BE":"\u0455",
"%BF":"\u0457",
"%C0":"\u0410",
"%C1":"\u0411",
"%C2":"\u0412",
"%C3":"\u0413",
"%C4":"\u0414",
"%C5":"\u0415",
"%C6":"\u0416",
"%C7":"\u0417",
"%C8":"\u0418",
"%C9":"\u0419",
"%CA":"\u041A",
"%CB":"\u041B",
"%CC":"\u041C",
"%CD":"\u041D",
"%CE":"\u041E",
"%CF":"\u041F",
"%D0":"\u0420",
"%D1":"\u0421",
"%D2":"\u0422",
"%D3":"\u0423",
"%D4":"\u0424",
"%D5":"\u0425",
"%D6":"\u0426",
"%D7":"\u0427",
"%D8":"\u0428",
"%D9":"\u0429",
"%DA":"\u042A",
"%DB":"\u042B",
"%DC":"\u042C",
"%DD":"\u042D",
"%DE":"\u042E",
"%DF":"\u042F",
"%E0":"\u0430",
"%E1":"\u0431",
"%E2":"\u0432",
"%E3":"\u0433",
"%E4":"\u0434",
"%E5":"\u0435",
"%E6":"\u0436",
"%E7":"\u0437",
"%E8":"\u0438",
"%E9":"\u0439",
"%EA":"\u043A",
"%EB":"\u043B",
"%EC":"\u043C",
"%ED":"\u043D",
"%EE":"\u043E",
"%EF":"\u043F",
"%F0":"\u0440",
"%F1":"\u0441",
"%F2":"\u0442",
"%F3":"\u0443",
"%F4":"\u0444",
"%F5":"\u0445",
"%F6":"\u0446",
"%F7":"\u0447",
"%F8":"\u0448",
"%F9":"\u0449",
"%FA":"\u044A",
"%FB":"\u044B",
"%FC":"\u044C",
"%FD":"\u044D",
"%FE":"\u044E",
"%FF":"\u044F"
};
var patt=/(\%[8-9a-fA-F][0-9a-fA-F])/g;
return txt.replace(patt, function(w_char){return encodeURIComponent(w2u[w_char]);});
}
function koi2uni(txt) {
var k2u = {
// [url]http://koi8.pp.ru/koi8-r_unicode.txt[/url]
"%80":"\u2500",
"%81":"\u2502",
"%82":"\u250C",
"%83":"\u2510",
"%84":"\u2514",
"%85":"\u2518",
"%86":"\u251C",
"%87":"\u2524",
"%88":"\u252C",
"%89":"\u2534",
"%8A":"\u253C",
"%8B":"\u2580",
"%8C":"\u2584",
"%8D":"\u2588",
"%8E":"\u258C",
"%8F":"\u2590",
"%90":"\u2591",
"%91":"\u2592",
"%92":"\u2593",
"%93":"\u2320",
"%94":"\u25A0",
"%95":"\u2219",
"%96":"\u221A",
"%97":"\u2248",
"%98":"\u2264",
"%99":"\u2265",
"%9A":"\u00A0",
"%9B":"\u2321",
"%9C":"\u00B0",
"%9D":"\u00B2",
"%9E":"\u00B7",
"%9F":"\u00F7",
"%A0":"\u2550",
"%A1":"\u2551",
"%A2":"\u2552",
"%A3":"\u0451",
"%A4":"\u2553",
"%A5":"\u2554",
"%A6":"\u2555",
"%A7":"\u2556",
"%A8":"\u2557",
"%A9":"\u2558",
"%AA":"\u2559",
"%AB":"\u255A",
"%AC":"\u255B",
"%AD":"\u255C",
"%AE":"\u255D",
"%AF":"\u255E",
"%B0":"\u255F",
"%B1":"\u2560",
"%B2":"\u2561",
"%B3":"\u0401",
"%B4":"\u2562",
"%B5":"\u2563",
"%B6":"\u2564",
"%B7":"\u2565",
"%B8":"\u2566",
"%B9":"\u2567",
"%BA":"\u2568",
"%BB":"\u2569",
"%BC":"\u256A",
"%BD":"\u256B",
"%BE":"\u256C",
"%BF":"\u00A9",
"%C0":"\u044E",
"%C1":"\u0430",
"%C2":"\u0431",
"%C3":"\u0446",
"%C4":"\u0434",
"%C5":"\u0435",
"%C6":"\u0444",
"%C7":"\u0433",
"%C8":"\u0445",
"%C9":"\u0438",
"%CA":"\u0439",
"%CB":"\u043A",
"%CC":"\u043B",
"%CD":"\u043C",
"%CE":"\u043D",
"%CF":"\u043E",
"%D0":"\u043F",
"%D1":"\u044F",
"%D2":"\u0440",
"%D3":"\u0441",
"%D4":"\u0442",
"%D5":"\u0443",
"%D6":"\u0436",
"%D7":"\u0432",
"%D8":"\u044C",
"%D9":"\u044B",
"%DA":"\u0437",
"%DB":"\u0448",
"%DC":"\u044D",
"%DD":"\u0449",
"%DE":"\u0447",
"%DF":"\u044A",
"%E0":"\u042E",
"%E1":"\u0410",
"%E2":"\u0411",
"%E3":"\u0426",
"%E4":"\u0414",
"%E5":"\u0415",
"%E6":"\u0424",
"%E7":"\u0413",
"%E8":"\u0425",
"%E9":"\u0418",
"%EA":"\u0419",
"%EB":"\u041A",
"%EC":"\u041B",
"%ED":"\u041C",
"%EE":"\u041D",
"%EF":"\u041E",
"%F0":"\u041F",
"%F1":"\u042F",
"%F2":"\u0420",
"%F3":"\u0421",
"%F4":"\u0422",
"%F5":"\u0423",
"%F6":"\u0416",
"%F7":"\u0412",
"%F8":"\u042C",
"%F9":"\u042B",
"%FA":"\u0417",
"%FB":"\u0428",
"%FC":"\u042D",
"%FD":"\u0429",
"%FE":"\u0427",
"%FF":"\u042A"
};
var patt=/(\%[8-9a-fA-F][0-9a-fA-F])/g;
return txt.replace(patt, function(k_char){return encodeURIComponent(k2u[k_char]);});
}