Décodage de lencodage dURL (encodage en pourcentage)

Je souhaite décoder lencodage dURL, existe-t-il un outil intégré pour le faire ou quelquun pourrait-il me fournir un sed code qui fera cela?

Jai cherché un peu dans unix.stackexchange.com et sur Internet mais je nai pas trouvé doutil de ligne de commande pour le décodage encodage url.

Ce que je veux faire, cest simplement sur place éditer un fichier txt afin que:

  • %21 devient !
  • %23 devient #
  • %24 devient $
  • %26 devient &
  • %27 devient "
  • %28 devient (
  • %29 devient )

Et ainsi de suite.

Commentaires

Réponse

Jai trouvé ces doublures Python one qui font ce que vous voulez:

Python2

$ alias urldecode="python -c "import sys, urllib as ul; \ print ul.unquote_plus(sys.argv[1])"" $ alias urlencode="python -c "import sys, urllib as ul; \ print ul.quote_plus(sys.argv[1])"" 

Python3

$ alias urldecode="python3 -c "import sys, urllib.parse as ul; \ print(ul.unquote_plus(sys.argv[1]))"" $ alias urlencode="python3 -c "import sys, urllib.parse as ul; \ print (ul.quote_plus(sys.argv[1]))"" 

Exemple

$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B 

Références

Commentaires

  • Je le sais très tard , mais y a-t-il un moyen de le faire avec lédition sur place?
  • @DisplayName – me semble être un nouveau Q. Je ‘ pose la question et je fais référence à celui-ci.
  • streaming: cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
  • Voir la réponse de @DIG mbl ‘ ci-dessous pour une réponse qui fonctionne avec stdin.

Réponse

sed

Essayez la ligne de commande suivante:

$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b" 

ou lalternative suivante en utilisant echo -e:

$ sed -e"s/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g" file | xargs echo -e 

Remarque: La syntaxe ci-dessus peut ne pas convertir + aux espaces, et peut manger toutes les nouvelles lignes.


Vous pouvez le définir comme alias et lajouter à vos fichiers shell rc :

$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"" 

Ensuite, chaque fois que vous en avez besoin, utilisez simplement:

$ echo "http%3A%2F%2Fwww" | urldecode http://www 

Bash

Lors de la création de scripts, vous pouvez utiliser la syntaxe suivante:

input="http%3A%2F%2Fwww" decoded=$(printf "%b" "${input//%/\\x}") 

Cependant, la syntaxe ci-dessus ne « gérera pas les plus (+) correctement, vous devez donc les remplacer par des espaces via sed ou comme suggéré par @isaac , utilisez la syntaxe suivante:

decoded=$(input=${input//+/ }; printf "${input//%/\\x}") 

Vous pouvez également utiliser les fonctions urlencode() et urldecode() suivantes:

urlencode() { # urlencode <string> local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "%%%02X" ""$c" ;; esac done } urldecode() { # urldecode <string> local url_encoded="${1//+/ }" printf "%b" "${url_encoded//%/\\x}" } 

Notez que ci-dessus urldecode() suppose que les données ne contiennent pas de barre oblique inverse.

Voici la version similaire de Joel trouvée à: https://github.com/sixarm/urldecode.sh


bash + xxd

Fonction Bash avec xxd outil:

urlencode() { local length="${#1}" for (( i = 0; i < length; i++ )); do local c="${1:i:1}" case $c in [a-zA-Z0-9.~_-]) printf "$c" ;; *) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done esac done } 

Trouvé dans le fichier gist de cdown « , également à stackoverflow .


PHP

En utilisant PHP, vous pouvez essayer la commande suivante:

$ echo oil+and+gas | php -r "echo urldecode(fgets(STDIN));" // Or: php://stdin oil and gas 

ou simplement:

php -r "echo urldecode("oil+and+gas");" 

Utilisez -R pour une entrée sur plusieurs lignes.


Perl

En Perl vous peut utiliser URI::Escape .

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Ou pour traiter un fichier:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

awk

Essayez anon solution:

awk -niord "{printf RT?$0chr("0x"substr(RT,2)):$0}" RS=%.. 

Remarque: Le paramètre -n est spécifique à GNU awk.

Voir: Utilisation de awk printf pour code urldecode .

décodage des noms de fichiers

Si vous devez supprimer le codage URL des noms de fichiers, utilisez loutil deurlname de renameutils (par exemple deurlname *.*).

Voir aussi:


En relation:

Commentaires

  • awk: Comme cela fait utilisation dune fonction de bibliothèque, chr(), il y a une forte probabilité quelle fonctionnera uniquement sur GNU awk (gawk). Cependant, dans ce cas, il ny aura pratiquement pas déquivalent pour POSIX awk, car loption -n (autorisant les arguments non décimaux) EST une spécialité GNU awk.
  • Vos solutions impliquant printf ne prennent pas en compte que lURL peut contenir des signes de pourcentage échappés comme %25. Vous les transmettez à printf sans les échapper pour printf avec un autre signe de pourcentage comme %%.
  • La version bash nécessite local LC_ALL=C en haut, sinon tous les caractères larges (cest-à-dire japonais, chinois, etc.) ne sont pas correctement décomposés en octets.
  • github.com/SixArm/ urlencode.sh
  • Les versions printf ne fonctionnent pas ‘ avec la version BSD de printf (par exemple macOS), mais cela fonctionne bien avec le Version de GNU Coreutils.

Réponse

Il existe une fonction intégrée pour cela dans la bibliothèque standard Python. Dans Python 2, il « s urllib.unquote .

decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url") 

Ou pour traiter un fichier:

python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file 

Dans Python 3, cest « s urllib.parse.unquote .

decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url") 

Ou pour traiter un fichier:

python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file 

En Perl, vous pouvez utiliser URI::Escape .

decoded_url=$(perl -MURI::Escape -e "print uri_unescape($ARGV[0])" "$encoded_url") 

Ou pour traiter un fichier:

perl -i -MURI::Escape -e "print uri_unescape($ARGV[0])" file 

Si vous voulez vous en tenir aux outils portables POSIX, cest  » Cest gênant, car le seul candidat sérieux est awk, qui nanalyse pas les nombres hexadécimaux. Voir Utilisation de awk printf pour code urldecode pour des exemples dimplémentations awk courantes, y compris BusyBox.

Réponse

Perl one liner:

$ perl -pe "s/\%(\w\w)/chr hex $1/ge" 

Exemple:

$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !" 

Commentaires

  • Cette réponse est intéressante lorsque vous ‘ ne voulez pas vous occuper de linstallation de modules Perl.
  • Un seul qui a fonctionné avec élégance pour moi sur MacOS.
  • Si vous souhaitez résoudre tous les niveaux dencodage dURL en même temps, ‘ s aussi perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' qui décodera tous les %25xx encodages imbriqués

Réponse

Si vous souhaitez utiliser une commande sed simple desprit, utilisez la commande suivante:

sed -e "s/%21/!/g" -e "s/%23/#/g" -e "s/%24/$/g" -e "s/%26/\&/g" -e "s/%27/"/g" -e "s/%28/(/g" -e "s/%29/)/g" 

Mais il est plus pratique de créer un script comme (disons sedscript):

 s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g  

Puis exécutez sed -f sedscript < old > new, qui affichera comme vous le souhaitez.


Pour plus de facilité, la commande urlencode est également disponible directement dans gridsite-clients peut être installé à partir de (par sudo apt-get install gridsite-clients dans le système Ubuntu / Debian).

NAME

    urlencode – convertir des chaînes vers ou depuis une forme encodée en URL

SYNOPSIS

    urlencode [-m|-d] string [string ...]

DESCRIPTION

    urlencode encode les chaînes conformément à la RFC 1738.

    Autrement dit, les caractères AZ az 09 . _ et - sont transmis sans modification, mais tous les autres caractères sont représentés par% HH, où HH est leur deux-d Représentation ASCII hexadécimale en majuscules igit. Par exemple, lURL http://www.gridpp.ac.uk/ devient http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode convertit chaque caractère dans toutes les chaînes données sur la ligne de commande. Si plusieurs chaînes sont données, elles sont concaténées avec des espaces de séparation avant la conversion.

OPTIONS

    -m

      Au lieu dune conversion complète, effectuez un « encodage dURL léger » GridSite dans lequel AZ az 0-9. = – _ @ et / sont passés sans modification. Il en résulte des chaînes légèrement plus lisibles par lhomme, mais lapplication doit être prête à créer ou simuler les répertoires impliqués par les barres obliques.

    -d

      Décodez plutôt les URL que lencodage, selon RFC 1738. Les chaînes% HH et% hh sont converties et les autres caractères sont passés sans modification, à lexception que + est converti en espace.

Exemple dURL de décodage:

$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc 

Commentaires

  • Pour un tutoriel sur sed visite
  • Cest une mauvaise solution, car elle nécessite un codage en dur de chaque caractère. Ce problème est illustré par le code qui manque la séquence déchappement %20 souvent utilisée.
  • @Overv I ‘ Révisé
  • Vous pouvez également vérifier ce que fait s/%26/&/g. (Je lai corrigé.)

Réponse

Je ne peux « pas commenter meilleure réponse dans ce fil , alors voici la mienne.

Personnellement, jutilise ces alias pour lencodage et le décodage dURL:

alias urlencode="python -c "import urllib, sys; print urllib.quote( sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" alias urldecode="python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" 

Les deux commandes vous permettent de convertir des données, passées en argument de ligne de commande ou de les lire depuis entrée standard , car les deux one-liners vérifient sil existe des arguments de ligne de commande (même vides) et les traitent ou lisent simplement entrée standard sinon.


mise à jour 2017-05-23 (encodage slash)

En réponse au commentaire de @Bevor.

Si vous doivent également encoder la barre oblique, ajoutez simplement un deuxième argument vide à la fonction de citation, puis la barre oblique sera également encodée.

Donc, enfin urlencode alias dans bash ressemble à ceci:

alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"" 

Examen ple

$ urlencode "Проба пера/Pen test" %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ echo "Проба пера/Pen test" | urlencode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test Проба пера/Pen test $ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode Проба пера/Pen test $ urlencode "Проба пера/Pen test" | urldecode Проба пера/Pen test $ echo "Проба пера/Pen test" | urlencode | urldecode Проба пера/Pen test 

Commentaires

  • Nencode pas les barres obliques.
  • @Bevor : Exemple?
  • Ajouter une barre oblique au code url  » Проба пера  » – > résultat: la barre oblique nest pas encodée.
  • @Bevor: Vous avez raison. Merci pour votre commentaire. Je changerai également ma réponse pour y refléter votre commentaire.

Réponse

GNU Awk

#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } } 

Réponse

Et une autre approche Perl:

 #!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }  

Vous devrez installer le module URI::Encode. Sur mon Debian, je pourrais simplement exécuter

sudo apt-get install liburi-encode-perl 

Ensuite, jai exécuté le script ci-dessus sur un fichier de test contenant:

 http://foo%21asd%23asd%24%26asd%27asd%28asd%29  

Le résultat était (javais enregistré le script sous foo.pl):

 $ ./foo.pl http://foo!asd#asd$&asd"asd(asd)  

Réponse

Une réponse dans le shell (principalement Posix):

$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !" 

Explication:

  • -e "s/+/ /g transforme chaque + en espace (comme décrit dans la norme url-encode)
  • -e "s/%\(..\)/\\\\x\1/g" transformez chaque %XX en \\xXX. Notez que lun des \ sera supprimé en citant les règles.
  • Le printf interne est juste là pour passer lentrée à sed. Nous pouvons le remplacer par tout autre mécanisme
  • Le printf externe interprète les \\xXX séquences et affiche le résultat.

Modifier:

Puisque % doit toujours être interprété dans les URL, il est possible de simplifier cette réponse. De plus, je pense quil est plus propre dutiliser xargs au lieu de backquotes (grâce à @josch).

$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" % 

Malheureusement, (comme @josch la remarqué) aucune de ces solutions nest compatible avec Posix car \x la séquence déchappement nest pas définie dans Posix.

Commentaires

  • Bienvenue dans U & L. Peut-être pourriez-vous expliquer cette réponse et comment cela fonctionne. Nous préférons généralement que nos réponses soient longues avec des détails, pas seulement des extraits de code.
  • Jaime beaucoup cette réponse car elle ‘ est complète, portable et ne fonctionne pas ‘ t nécessitent des programmes externes plus lourds comme perl ou python. Fonctionne bien pour moi.
  • Excellente solution. Et encore plus court et plus intelligent: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. Loption -e peut être omise ici en fait …
  • @josch Vous avez raison, printf est un intégré dans dash et il ne ‘ pas reconnaître \x échapper. Vous pouvez utiliser /usr/bin/printf au lieu de printf pour le faire fonctionner. Normalement, vous devriez pouvoir utiliser command printf, mais cela ne semble pas fonctionner comme il se doit. Il continue à utiliser intégré.
  • @Jezz en effet la prise en charge de léchappement \x ne fait pas partie de POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Au cours de mes tests, jai vu un autre problème. Vous voudrez peut-être remplacer votre .. regex par [a-zA-Z0-9][a-zA-Z0-9] car sinon, entrez comme ‘ %% % ‘ échouera. Jai également ajouté s/%/%%/g à la fin pour massurer déchapper aux pourcentages pour printf.

Réponse

Une autre solution utilisant ruby (la réponse python acceptée ne fonctionnait pas pour moi)

 alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""  

Exemple

 $ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B  

Commentaires

  • Juste utilisé pour ruby, et ces déclarations ont lair plus petites. De plus, jai changé pour ARGF.read afin que je puisse le canaliser comme je le fais avec de nombreux autres utilitaires!

Réponse

Voici une fonction BASH pour faire exactement cela:

function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") } 

Commentaires

  • fonctionne comme un charme
  • Si vous souhaitez convertir les caractères + en et ne pas générer de processus, vous pouvez utiliser ceci: : "${1//+/ }" && echo -e "${_//%/\\x}"

Réponse

Shell uniquement:

 $ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ  

Ajoutez -- ou %b pour éviter que les arguments commençant par un tiret soient traités comme des options.

In zsh ${x//%/a} ajoute a à la fin mais ${x//\%/a} remplace % par a.

Réponse

Voici les éléments pertinents dun autre script (que jai juste sans vergogne volé de mon script de téléchargement youtube.com à partir dune autre réponse) Jai déjà écrit. Il utilise sed et le shell pour créer un urldecode fonctionnel.

set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )" 

Je ne jurerais pas que cest complet – et en fait jen doute – mais il a bien géré YouTube.

Réponse

La solution simple pour chaînes courtes (le shell est lentwww):

$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/; 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *