Сегодня толкнулся с этим же исключением и не знаю, как найти выход.
Специфика у меня такая: от сервера API приходит текст сообщения. Чтобы сделать ссылки в этом сообщении кликабельными, я прогоняю текст через парсер, который помимо основной задачи делает ссылки читабельными с помощью decodeURIComponent — для размещения их текста внутри <a></a>. Порой сайт (VK) обрезает ссылки не в том месте, и из-за исключения работа парсера рушится.
Можно ли как-то исправить положение? Отказываться от превращения читабельных ссылок в обычные не хочется, сам VK с этим ведь как-то справляется. Можно ли проверить валидность ссылки для decodeURIComponent ещё до вызова? Дописать/обрезать её так, чтобы всё работало? Применять unescape нельзя, т.к. везде кириллица.
UPD через час
Пока решил через
try..catch, но если кто-то знает решение, позволяющее модифицировать URI до валидного состояния (чтобы можно было парсить), напишите здесь, пожалуйста.
UPD2 через 7 часов
Читал
документацию ES5, не совсем осилил, и придумал вот что:
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
}
decodeURIComponentX('http://vk.com/developers.php?oid=-1&p=%D0%9E%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D0%BB%D0%B5%D0%B9_%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%8')
Уже куда лучше, чем пропускать негодный URI вообще. Но есть сомнения по поводу регулярки: во-первых, сейчас массив из-за неё получается своеобразный, с пустыми элементами, а во-вторых, %D0 и %D1 хватает только для кириллицы, всякие
æ по-прежнему будут выпадать с ошибкой.