5 августа 2013, 17:40

JavaScript: лечим URIError: malformed URI sequence

Иногда (на сайтах с разными кодировками) выскакивает ошибка URIError: malformed URI sequence при использовании decodeURIComponent.
Браузер ругается на символ процента в урле, что бы этого избежать, можно использовать такой вот костыль
function decodeURIComponentX( str ) {
    var out = '', arr, i = 0, l, x;
    arr = str.split(/(%(?:D0|D1)%.{2})/);
    for ( l = arr.length; i < l; i++ ) {
        try {
            x = decodeURIComponent( arr[i] );
        } catch (e) {
            x = arr[i];
        }
        out += x;
    }
    return out
}

2 комментария РСС

unescape
Может вы в курсе, просвятите. Что за моральные уроды педалируют такие недометоды как decodeURIComponent и decodeURI? Причем взяли и выкинули проверенный временем безотказный unescape, мол, устарел, скоро будет удален, не рекомендуется его нигде пользовать, а только вот эти два горе-декодера, которые очень часто слетают, например, на знаке процента, так что приходится к ним костыли прикручивать. То есть, такая вот простая строчка
e=decodeURIComponent(’100D0%A5%D0%BD%D1%8F!');
непременно вызовет ошибку
URIError: malformed URI sequence.
Тогда как unescape вернет строку, не ту конечно, но вернет. А теперь сделаем так:
e=decodeURIComponent(
escape(unescape('100
D0%A5%D0%BD%D1%8F!’))
);
И это сработает без проблем, результат будет гарантирован и корректен. Но! Если escape и unescape отменят, придется видимо громоздить чуть ли не посимвольные проверки на декодабильность, занимающие дополнительные ресурсы и время. Короче, WTF!
unescape
Интересно. При отправке куда-то пропал знак процента (даже два знака):
100[%][%]D0%A5%D0%BD%D1%8F!

Ваш комментарий

адрес не будет опубликован

ХТМЛ не работает


Ctrl + Enter