Я использую следующий тест, чтобы увидеть, были ли строки закодированы:
if(urlencode($str) != str_replace(['%','+'], ['%25','%2B'], $str))
Если строка уже была закодирована в urlen-кодировке, единственными символами, которые будут изменены двойным кодированием, являются% (который начинает все строки кодированных символов) и + (который заменяет пробелы.) Измените их обратно, и у вас должна быть исходная строка.
Дайте мне знать, если это работает для вас.