Нет надежного способа сделать это, поскольку есть строки, которые остаются неизменными в процессе кодирования, то есть кодируется ли «abc» или нет? Там нет четкого ответа. Кроме того, как вы уже видели, некоторые символы имеют несколько кодировок ... Но ...
Ваша схема декодирования-проверки-кодирования-проверки завершается сбоем из-за того, что некоторые символы могут быть закодированы более чем одним способом. Однако небольшое изменение вашей функции должно быть достаточно надежным, просто проверьте, изменяет ли декодирование строку, если это так, то она была закодирована.
Конечно, это не будет доказательством дурака, так как "10 + 20 = 30" вернет true (+ преобразуется в пробел), но мы на самом деле просто делаем арифметику. Я полагаю, это то, что ваша схема пытается противостоять, я сожалею, что не думаю, что есть идеальное решение.
НТН.
Edit:
Как я уже упоминал в своем собственном комментарии (просто повторяя здесь для ясности), хорошим компромиссом, вероятно, будет проверка на наличие недопустимых символов в вашем URL (например, пробел), и если они есть, они не закодированы. Если их нет, попробуйте декодировать и посмотреть, изменится ли строка. Это все равно не справится с приведенной выше арифметикой (что невозможно), но, надеюсь, этого будет достаточно.