Javascript decodeURI (компонент) искаженное исключение uri

Я ввел следующее в консоли Chrome:

decodeURIComponent('a%AFc');

Вместо того, чтобы привести к a0xAFc, это вызвало исключение URIError (неверный формат uri).

Я слышал несколько оправданий, почему это возможно, но я не понимаю, почему?

В частности, функция decodeURIComponent() предназначена для декодирования данных, а не для проверки URI.


person Christian    schedule 30.01.2012    source источник


Ответы (2)


%AF не является отдельным символом, а является частью последовательности Unicode (MACRON - %C2%AF).

%AF был создан не encodeURIComponent, а чем-то вроде escape, поэтому его может расшифровать unescape.

То, что вам, вероятно, нужно, это decodeURIComponent('%C2%AF')

person Juicy Scripter    schedule 30.01.2012
comment
Я придумал это после того, как попытался декодировать загрузку закодированного текста, потерпел неудачу и заметил, что он захлебнется этим конкретным символом. Возможно, unescape это то, что мне нужно. - person Christian; 30.01.2012
comment
@ChristianSciberras encodeURIComponent() обычно является лучшим выбором, потому что он работает с UTF-8. Однако 0xAF сама по себе не является допустимой последовательностью символов в кодировке UTF-8. Вот почему ваш код не работает. Надеюсь, теперь стало понятнее. - person duri; 30.01.2012
comment
Так что, если мне нужно обрабатывать входные данные, закодированные в процентах ASCII / iso-8859-1? unescape устарела, а unescapeURI тоже нет - person felixfbecker; 12.12.2016
comment
Такой человек, как ты, заслуживает особого места на небесах. Вы решили мою проблему. Спасибо - person Harsh Patel; 28.04.2021

Это может или не может относиться к чьей-то ситуации, но это то, что сделало это для меня, поэтому я решил поделиться. Я загружаю и скачиваю множество текстовых файлов в пользовательскую CMS.
Знак %' в исходном коде сеет для меня хаос.

// send to server
content = content.toString().replace(/%/g,'~~pct~~');       // ~~pct~~ <-made up replacement
content = encodeURI(content);

// get back from server / database
content = decodeURI(content);
content = content.toString().replace(/~~pct~~/g,'%');    // globally restore '%'
person Nelles    schedule 29.03.2019