Как сохранить символ % при кодировании URI в JavaScript?

У меня возникла проблема с сохранением последовательности %2F в строке URI. Функция encodeURI кодирует % как %25, из-за чего вместо %2F получается %252F.

Важно отметить, что это происходит внутри фреймворка, поэтому манипуляции с JavaScript не подходят. Нужно решение на уровне экранирования строк.

Я пробовал использовать обратный слэш разными способами, но ничего не помогло. Есть ли какой-то способ сохранить % в исходном виде при кодировании URI?

А может попробовать заменить % на что-то другое до кодирования, а потом вернуть обратно? Типа % → PERCENT → кодирование → обратная замена. Или использовать регулярку, чтобы найти все %, за которыми идут две hex-цифры, и временно их заменить. Просто мысли вслух, может натолкнет на идею. А вообще странно, что фреймворк так себя ведет, может есть какая-то настройка для этого?

Для сохранения % можно использовать encodeURIComponent вместо encodeURI.

Он не кодирует %, если за ним следуют две шестнадцатеричные цифры.

Также можно попробовать двойное кодирование: сначала закодировать только критичные символы (кроме %), а потом применить encodeURI ко всей строке.

Если это не поможет, придется реализовать свою функцию кодирования, которая будет обходить % и кодировать остальные символы по спецификации URI.

да, это реально головная боль с этими процентами! я в своем проекте столкнулся с похожей проблемой. в итоге пришлось написать свою функцию кодирования - просто проходился по строке и кодировал всё кроме % и цифр/букв после него. получилось не очень красиво, но работает. еще вариант - использовать какую-нибудь готовую библиотеку для работы с uri, там обычно есть разные полезные функции. главное не забыть потом все протестировать на разных кейсах, а то такие штуки любят преподносить сюрпризы