Comment savoir si la chaîne a déjà été encodée en URL?

Comment pourrais-je vérifier si la chaîne a déjà été encodée?

Par exemple, si j’encode TEST== , j’obtiens TEST%3D%3D . Si je code à nouveau la dernière chaîne, j’obtiens TEST%253D%253D , il faudrait que je sache avant de le faire si c’est déjà codé …

J’ai enregistré des parameters et je dois les rechercher. Je ne sais pas pour les parameters d’entrée, ce qu’ils seront – encodés ou non, donc je dois savoir si je dois les encoder ou les décoder avant la recherche.

Décoder, comparer à l’original. S’il diffère, l’original est encodé. S’il ne diffère pas, l’original n’est pas encodé. Mais encore rien ne dit si la nouvelle version décodée n’est pas encore encodée. Une bonne tâche pour la récursivité.

J’espère que l’on ne peut pas écrire un quine dans urlencode, ou cet algorithme restrait bloqué.

Utilisez regexp pour vérifier si votre chaîne contient des caractères illégaux (c.-à-d. Des caractères qui ne peuvent pas être trouvés dans une chaîne codée en URL, comme les espaces).

Joel sur le logiciel avait une solution pour cela – http://www.joelonsoftware.com/articles/Wrong.html
Ou vous pouvez append un préfixe aux chaînes.

Vous ne pouvez pas savoir avec certitude, à moins que vos chaînes ne correspondent à un certain modèle, ou que vous gardiez une trace de vos chaînes. Comme vous l’avez noté vous-même, une chaîne qui est encodée peut également être encodée, vous ne pouvez donc pas être sûr à 100% en regardant la chaîne elle-même.

Essayez de décoder l’URL. Si la chaîne résultante est plus courte que l’original, l’URL d’origine était déjà encodée, sinon vous pouvez l’encoder en toute sécurité (que ce soit non codé, ou même post-encodage, l’URL rest inchangée). ). Voici un exemple de code pseudo (inspiré par ruby):

 # Returns encoded URL for any given URL after determining whether it is already encoded or not def escape(url) unescaped_url = URI.unescape(url) if (unescaped_url.length < url.length) return url else return URI.escape(url) end end