D
2) Если ты хочешь реально сам написать парсер закодированых строк тебе придётся соблюсти спецификацию, иначе будут проблемы. Именно поэтому в языке это уже есть - самому это писать сложно
3) Создай объект типа const dictionary = {'%21':'!', '%23':'#' }, и делай
for(const encoded in dictionary ) string.replace(encoded, dictionary[encoded])