Показать сообщение отдельно
  #1 (permalink)  
Старый 18.07.2009, 20:50
Новичок на форуме
Отправить личное сообщение для Birukoff Посмотреть профиль Найти все сообщения от Birukoff
 
Регистрация: 18.07.2009
Сообщений: 1

перекодирование 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]);});
    }
Ответить с цитированием