перекодирование url из koi8 и cp1251 в unicode
Я только начал учить 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]);}); } |
Объекты и регулярки создаются при каждом запуске функций, лучше так:
var koi2uni = (function() { var k2u = {/*....*/}, patt=/(\%[8-9a-fA-F][0-9a-fA-F])/g; return function(txt) { return txt.replace(patt, function(k_char) {return encodeURIComponent(k2u[k_char])}); }; })(); |
Часовой пояс GMT +3, время: 07:22. |