Dekodierung der URL-Kodierung (prozentuale Kodierung)

Ich möchte die URL-Kodierung entschlüsseln, gibt es dafür ein eingebautes Tool oder könnte mir jemand ein sed Code, der dies tut?

Ich habe ein bisschen in unix.stackexchange.com und im Internet gesucht, aber ich konnte kein Befehlszeilen-Tool zum Dekodieren finden URL-Codierung.

Ich möchte einfach eine txt -Datei so bearbeiten, dass:

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

und so weiter.

Kommentare

Antwort

Es wurden diese Python-Einzeiler gefunden, die das tun, was Sie wollen:

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]))"" 

Beispiel

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

Referenzen

Kommentare

  • Ich weiß das sehr spät , aber gibt es eine Möglichkeit, dies mit der Bearbeitung vor Ort zu tun?
  • @DisplayName – klingt für mich wie ein neues Q. Ich ‚ würde es fragen und auf dieses verweisen.
  • 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]"
  • Siehe @DIG mbl ‚ s Antwort beblow für eine, die mit stdin funktioniert.

Antwort

sed

Versuchen Sie die folgende Befehlszeile:

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

oder die folgende Alternative mit echo -e:

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

Hinweis: Die obige Syntax konvertiert möglicherweise nicht + in Leerzeichen und kann alle Zeilenumbrüche essen.


Sie können es als Alias definieren und zu Ihren Shell- rc -Dateien hinzufügen:

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

Dann gehen Sie jedes Mal, wenn Sie es brauchen, einfach mit:

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

Bash

Beim Scripting können Sie die folgende Syntax verwenden:

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

Die obige Syntax behandelt jedoch keine Pluspunkte () korrekt, daher müssen Sie sie über sed oder wie von @isaac vorgeschlagen, verwenden Sie die folgende Syntax:

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

Sie können auch die folgenden Funktionen urlencode() und urldecode() verwenden:

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}" } 

Beachten Sie, dass oben urldecode() davon ausgeht, dass die Daten keinen Backslash enthalten.

Hier ist eine ähnliche Version von Joel: https://github.com/sixarm/urldecode.sh


bash + xxd

Bash-Funktion mit dem Tool xxd:

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 } 

Gefunden in der Hauptdatei von cdown „, auch unter stackoverflow .


PHP

Mit PHP können Sie den folgenden Befehl ausführen:

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

oder einfach:

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

Verwenden Sie -R für die Eingabe mehrerer Zeilen.


Perl

In Perl du kann URI::Escape verwenden.

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

Oder um eine Datei zu verarbeiten:

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

awk

Versuchen Sie anon Lösung:

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

Hinweis: Der Parameter -n ist spezifisch für GNU awk.

Siehe: Verwenden von awk printf zum URL-Code von Text .

Dateinamen dekodieren

Wenn Sie die URL-Kodierung aus den Dateinamen entfernen müssen, verwenden Sie das Tool deurlname aus renameutils (z deurlname *.*).

Siehe auch:


Verwandte Themen:

Kommentare

  • awk: Wie dies macht Bei Verwendung einer Bibliotheksfunktion, chr(), besteht eine hohe Wahrscheinlichkeit, dass sie ausschließlich mit GNU awk funktioniert (gawk). In diesem Fall gibt es jedoch kaum ein Äquivalent für POSIX awk, da die Option -n (die nicht dezimale Argumente zulässt) IST eine Spezialität von GNU awk.
  • Ihre Lösungen mit printf berücksichtigen dies nicht Die URL enthält möglicherweise maskierte Prozentzeichen wie %25. Sie übergeben diese an printf, ohne sie für printf mit einem anderen Prozentzeichen wie %% zu maskieren.
  • Für die Bash-Version ist local LC_ALL=C oben, sonst werden alle breiten Zeichen (z. B. Japanisch, Chinesisch usw.) nicht richtig in Bytes unterteilt.
  • github.com/SixArm/ urlencode.sh
  • Die printf-Versionen ‚ funktionieren bei Verwendung der BSD-Version von printf (z. B. macOS) nicht, funktionieren jedoch bei Verwendung von GNU Coreutils-Version.

Antwort

Dafür gibt es in der Python-Standardbibliothek eine integrierte Funktion. In Python 2 ist es urllib.unquote .

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

Oder um eine Datei zu verarbeiten:

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

In Python 3 ist es urllib.parse.unquote .

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

Oder um eine Datei zu verarbeiten:

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

In Perl können Sie URI::Escape verwenden.

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

Oder um eine Datei zu verarbeiten:

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

Wenn Sie sich an tragbare POSIX-Tools halten möchten, “ Es ist umständlich, weil der einzige ernsthafte Kandidat awk ist, der keine hexadezimalen Zahlen analysiert. Beispiele für gängige awk-Implementierungen, einschließlich BusyBox, finden Sie unter Verwenden von awk printf zum URL-Code .

Antwort

Perl einzeilig:

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

Beispiel:

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

Kommentare

  • Diese Antwort ist attraktiv, wenn Sie ‚ nicht mit der Installation von Perl-Modulen befassen möchten.
  • Nur eine, die unter MacOS für mich elegant funktioniert hat.
  • Wenn Sie alle Ebenen der URL-Codierung gleichzeitig auflösen möchten, gibt es ‚ s auch perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);', das alle %25xx verschachtelten Codierungen

Antwort

Wenn Sie einen einfältigen sed -Befehl verwenden möchten, verwenden Sie Folgendes:

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" 

Es ist jedoch bequemer, ein Skript wie (z. B. sedscript) zu erstellen:

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

Führen Sie dann sed -f sedscript < old > new aus, das wie gewünscht ausgegeben wird.


Der Einfachheit halber ist der Befehl urlencode auch direkt in gridsite-clients kann von (über sudo apt-get install gridsite-clients im Ubuntu / Debian-System) installiert werden.

NAME

    urlencode – Konvertiert Zeichenfolgen in oder aus einer URL-codierten Form.

ÜBERSICHT

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

BESCHREIBUNG

    urlencode codiert Zeichenfolgen gemäß RFC 1738.

    Das heißt, Zeichen AZ az 09 . _ und - werden unverändert durchlaufen. Alle anderen Zeichen werden jedoch als% HH dargestellt, wobei HH ihre Zwei-D ist igit hexadezimale ASCII-Darstellung in Großbuchstaben. Beispielsweise wird die URL http://www.gridpp.ac.uk/ zu http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode konvertiert jedes Zeichen in allen Zeichenfolgen in der Befehlszeile. Wenn mehrere Zeichenfolgen angegeben werden, werden diese vor der Konvertierung mit getrennten Leerzeichen verknüpft. OPTIONEN

      -m

        Führen Sie anstelle der vollständigen Konvertierung die „milde URL-Codierung“ von GridSite durch. in dem AZ az 0-9. = – _ @ und / werden unverändert durchlaufen. Dies führt zu etwas besser lesbaren Zeichenfolgen, aber die Anwendung muss darauf vorbereitet sein, die Verzeichnisse zu erstellen oder zu simulieren, die durch Schrägstriche impliziert werden. -d

          Führen Sie stattdessen eine URL-Dekodierung durch Laut HFC 1738 werden% HH- und% hh-Zeichenfolgen konvertiert und andere Zeichen unverändert durchlaufen, mit der Ausnahme, dass + in Leerzeichen konvertiert wird.

Beispiel für die Dekodierung der URL:

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

Kommentare

  • Ein Tutorial zu sed besuchen Sie
  • Dies ist eine schlechte Lösung, da jedes Zeichen fest codiert werden muss. Dieses Problem wird durch Ihren Code veranschaulicht, dem die häufig verwendete Escape-Sequenz %20 fehlt.
  • @Overv Ich ‚ habe gerade Überarbeitet
  • Vielleicht möchten Sie auch noch einmal überprüfen, was s/%26/&/g tut. (Ich habe es behoben.)

Antwort

Ich kann beste Antwort in diesem Thread , also hier ist meine.

Ich persönlich verwende diese Aliase für die URL-Codierung und -Decodierung:

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])"" 

Mit beiden Befehlen können Sie Daten konvertieren, die als Befehlszeilenargument übergeben oder von gelesen werden Standardeingabe , da beide Einzeiler prüfen, ob Befehlszeilenargumente vorhanden sind (auch leere) und diese verarbeiten oder nur lesen Andernfalls Standardeingabe.


Update 2017-05-23 (Schrägstrichcodierung)

Als Antwort auf den Kommentar von @Bevor.

Wenn Sie Sie müssen auch den Schrägstrich codieren. Fügen Sie der Anführungszeichenfunktion einfach ein leeres zweites Argument hinzu. Dann wird auch der Schrägstrich codiert.

Also schließlich urlencode Alias in bash sieht folgendermaßen aus:

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

Prüfung 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 

Kommentare

  • Codiert keine Schrägstriche.
  • @Bevor : Beispiel?
  • Fügen Sie einen Schrägstrich zum Urlencode hinzu “ divроба пера “ – > Ergebnis: Schrägstrich ist nicht codiert.
  • @Bevor: Sie haben Recht. Danke für deinen Kommentar. Ich werde auch meine Antwort ändern, um Ihren Kommentar darin wiederzugeben.

Antwort

GNU Awk

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

Antwort

Und ein weiterer Perl-Ansatz:

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

Sie müssen das Modul URI::Encode installieren. Auf meinem Debian konnte ich einfach

sudo apt-get install liburi-encode-perl 

ausführen. Dann führte ich das obige Skript in einer Testdatei aus, die Folgendes enthielt:

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

Das Ergebnis war (ich hatte das Skript als foo.pl gespeichert):

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

Antwort

Eine Antwort in der (meistens Posix-) Shell:

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

Erläuterung:

  • -e "s/+/ /g transformiert jedes + im Raum (wie in der URL-Codierungsnorm beschrieben)
  • -e "s/%\(..\)/\\\\x\1/g" transformiere jedes %XX in \\xXX. Beachten Sie, dass \ durch Zitieren von Regeln entfernt wird.
  • Der innere printf dient nur dazu, Eingaben an sed zu übergeben. Wir können es durch einen anderen Mechanismus ersetzen.
  • Der äußere Druck interpretiert \\xXX Sequenzen und zeigt das Ergebnis an.

Bearbeiten:

Da % immer in URLs interpretiert werden sollte, Es ist möglich, diese Antwort zu vereinfachen. Außerdem halte ich es für sauberer, xargs anstelle von backquotes zu verwenden (dank @josch).

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

Leider ist (wie @josch bemerkt hat) keine dieser Lösungen Posix-konform, da die \x Escape-Sequenz in Posix nicht definiert ist.

Kommentare

  • Willkommen bei U & L. Vielleicht könnten Sie diese Antwort erklären und wie es funktioniert. Wir bevorzugen im Allgemeinen, dass unsere Antworten in Langform mit Details und nicht nur Code-Schnipsel vorliegen.
  • Diese Antwort gefällt mir sehr gut, da sie ‚ umfassend, portabel und nicht ‚ erfordert keine besonders schweren externen Programme wie Perl oder Python. Funktioniert gut für mich.
  • Tolle Lösung. Und noch kürzer und intelligenter: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. Die Option -e kann hier tatsächlich weggelassen werden …
  • @josch Sie haben Recht, printf ist a Eingebautes dash und ‚ erkennt nicht, dass \x entkommt. Sie können /usr/bin/printf anstelle von printf verwenden, damit es funktioniert. Normalerweise sollten Sie in der Lage sein, command printf zu verwenden, aber es scheint nicht so zu funktionieren, wie es sollte. Es wird weiterhin integriert verwendet.
  • @Jezz unterstützt in der Tat die Unterstützung für \x Escape ist nicht Teil von POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Während meiner Tests habe ich ein anderes Problem festgestellt. Möglicherweise möchten Sie Ihre .. Regex durch [a-zA-Z0-9][a-zA-Z0-9] ersetzen, da andernfalls ‚ %% eingegeben wird % ‚ schlägt fehl. Ich habe am Ende auch s/%/%%/g hinzugefügt, um sicherzustellen, dass Prozentsätze für printf nicht berücksichtigt werden.

Antwort

Eine andere Lösung mit Ruby (akzeptierte Python-Antwort funktionierte bei mir nicht)

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

Beispiel

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

Kommentare

  • Wird nur für Ruby verwendet, und diese Anweisungen sehen kleiner aus. Außerdem habe ich zu ARGF.read gewechselt, damit ich es wie bei vielen anderen Dienstprogrammen einfügen kann!

Antwort

Hier ist eine BASH-Funktion, um genau das zu tun:

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

Kommentare

  • funktioniert wie Charme
  • Wenn Sie + Zeichen in konvertieren möchten Leerzeichen und keine Prozesse erzeugen, können Sie Folgendes verwenden: : "${1//+/ }" && echo -e "${_//%/\\x}"

Antwort

Nur Shell:

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

Fügen Sie -- oder %b, um zu verhindern, dass Argumente, die mit einem Bindestrich beginnen, als Optionen behandelt werden.

In zsh ${x//%/a} fügt am Ende a hinzu, aber ${x//\%/a} ersetzt % durch a.

Antwort

Hier sind die relevanten Bits aus einem anderen Skript (das ich nur schamlos mache gestohlen von meinem youtube.com-Download-Skript aus einer anderen Antwort) Ich habe zuvor geschrieben. Es verwendet sed und die Shell, um einen funktionierenden URL-Code aufzubauen.

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

Ich schwöre nicht, dass es umfassend ist – und tatsächlich bezweifle ich es – aber es hat YouTube sicher genug gehandhabt.

Antwort

Die einfache Lösung für kurze Zeichenfolgen (Shell ist langsam):

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


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.