Decodifica della codifica dellURL (codifica in percentuale)

Voglio decodificare la codifica dellURL, esiste uno strumento integrato per farlo o qualcuno potrebbe fornirmi un sed codice che lo farà?

Ho cercato un po in unix.stackexchange.com e su Internet ma non sono riuscito a trovare alcuno strumento a riga di comando per la decodifica codifica URL.

Quello che voglio fare è semplicemente modificare un file txt in modo che:

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

E così via.

Commenti

Risposta

Ho trovato queste righe di Python che fanno quello che vuoi:

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

Esempio

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

Riferimenti

Commenti

  • Lo so molto tardi , ma cè un modo per farlo con lediting sul posto?
  • @DisplayName – mi suona come una nuova Q. ‘ lo chiedo e faccio riferimento a questo.
  • 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]"
  • Vedi @DIG mbl ‘ s beblow per uno che funziona con stdin.

Risposta

sed

Prova la seguente riga di comando:

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

o la seguente alternativa utilizzando echo -e:

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

Nota: la sintassi precedente potrebbe non convertire + agli spazi e può mangiare tutte le nuove righe.


Puoi definirlo come alias e aggiungerlo ai tuoi file rc della shell:

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

Quindi, ogni volta che ne hai bisogno, segui semplicemente:

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

Bash

Durante lo scripting, puoi utilizzare la seguente sintassi:

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

Tuttavia la sintassi precedente non “t gestisce i vantaggi (+) correttamente, quindi devi sostituirli con spazi tramite sed o come suggerito da @isaac , utilizza la seguente sintassi:

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

Puoi anche utilizzare le seguenti urlencode() e urldecode() funzioni:

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

Tieni presente che urldecode() presume che i dati non contengano barra rovesciata.

Ecco una versione simile di Joel trovata in: https://github.com/sixarm/urldecode.sh


bash + xxd

Funzione Bash con lo strumento 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 } 

Trovato nel cdown “s file gist , anche in stackoverflow .


PHP

Utilizzando PHP puoi provare il seguente comando:

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

o semplicemente:

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

Utilizza -R per limmissione di più righe.


Perl

In Perl tu può utilizzare URI::Escape .

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

Oppure per elaborare un file:

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

awk

Prova anon soluzione:

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

Nota: il parametro -n è specifico di GNU awk.

Vedi: Uso di awk printf per urldecode testo .

decodifica dei nomi dei file

Se devi rimuovere la codifica dellURL dai nomi dei file, utilizza lo strumento deurlname da renameutils (es deurlname *.*).

Vedi anche:


Correlati:

Commenti

  • awk: poiché questo fa utilizzando una funzione di libreria, chr(), cè unalta probabilità che funzioni esclusivamente su GNU awk (gawk). Tuttavia, in questo caso non ci sarà quasi alcun equivalente per POSIX awk, perché lopzione -n (che consente argomenti non decimali) È una awk specialità GNU.
  • Le tue soluzioni che coinvolgono printf non tengono conto che lURL potrebbe contenere segni di percentuale di escape come %25. Li passi a printf senza eseguire lescape per printf con un altro segno di percentuale come %%.
  • La versione bash richiede local LC_ALL=C in alto, altrimenti tutti i caratteri larghi (ad esempio giapponese, cinese e così via) non vengono suddivisi correttamente in byte.
  • github.com/SixArm/ urlencode.sh
  • Le versioni printf don ‘ t funzionano quando si usa la versione BSD di printf (es. macOS), tuttavia funziona bene quando si usa il Versione GNU Coreutils.

Risposta

Esiste una funzione incorporata per questo nella libreria standard di Python. In Python 2, “s urllib.unquote .

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

Oppure per elaborare un file:

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

In Python 3, “s urllib.parse.unquote .

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

Oppure per elaborare un file:

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

In Perl puoi utilizzare URI::Escape .

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

Oppure per elaborare un file:

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

Se vuoi restare fedele agli strumenti portatili POSIX, ” è imbarazzante, perché lunico candidato serio è awk, che non analizza i numeri esadecimali. Vedi Utilizzo di awk printf per urldecode testo per esempi con implementazioni awk comuni, incluso BusyBox.

Risposta

Perl one liner:

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

Esempio:

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

Commenti

  • Questa risposta è interessante quando ‘ non vuoi occuparti dellinstallazione di moduli perl.
  • Solo uno che ha funzionato elegantemente per me su MacOS.
  • Se desideri risolvere tutti i livelli di codifica URL contemporaneamente, è disponibile ‘ s anche perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' che decodificherà tutte le %25xx codifiche nidificate

Risposta

Se desideri utilizzare un semplice comando sed, utilizza quanto segue:

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" 

Ma è più comodo creare uno script come (ad esempio sedscript):

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

Quindi esegui sed -f sedscript < old > new, che produrrà come desideri.


Per comodità, il comando urlencode è disponibile anche direttamente in gridsite-clients può essere installato da (da sudo apt-get install gridsite-clients nel sistema Ubuntu / Debian).

NAME

    urlencode – converte le stringhe in o dal formato con codifica URL

SINOSSI

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

DESCRIZIONE

    urlencode codifica le stringhe in base alla RFC 1738.

    Ovvero, i caratteri AZ az 09 . _ e - vengono trasmessi senza modifiche, ma tutti gli altri caratteri sono rappresentati come% HH, dove HH è la loro due-d igit rappresentazione ASCII esadecimale maiuscola. Ad esempio, lURL http://www.gridpp.ac.uk/ diventa http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode converte ogni carattere in tutte le stringhe fornite sulla riga di comando. Se vengono fornite più stringhe, vengono concatenate con spazi di separazione prima della conversione.

OPZIONI

    -m

      Invece della conversione completa, esegui la “codifica URL moderata” di GridSite in cui AZ az 0-9. = – _ @ e / vengono passati senza modifiche. Ciò si traduce in stringhe leggermente più leggibili dalluomo, ma lapplicazione deve essere preparata per creare o simulare le directory implicite da eventuali barre.

    -d

      Decodifica piuttosto lURL rispetto alla codifica, secondo la RFC 1738. Le stringhe% HH e% hh vengono convertite e altri caratteri vengono passati senza modifiche, con leccezione che + viene convertito in spazio.

Esempio di decodifica URL:

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

Commenti

  • Per il tutorial su sed visita
  • Questa è una cattiva soluzione, perché richiede lhardcoding di ogni carattere. Questo problema è esemplificato dal codice che manca della %20 sequenza di escape.
  • @Overv I ‘ ho appena Rivisto
  • Inoltre, potresti voler ricontrollare cosa fa s/%26/&/g. (Lho risolto.)

Risposta

Non posso “t commentare la migliore risposta in questo thread , quindi ecco la mia.

Personalmente, utilizzo questi alias per la codifica e la decodifica dellURL:

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

Entrambi i comandi consentono di convertire i dati, passati come argomento della riga di comando o di leggerli da standard input , perché entrambe le battute verificano se ci sono argomenti della riga di comando (anche vuoti) e li elaborano o semplicemente leggono input standard altrimenti.


aggiornamento 23/05/2017 (codifica barra)

In risposta al commento di @Bevor.

Se tu anche bisogno di codificare la barra, basta aggiungere un secondo argomento vuoto alla funzione quote, quindi anche la barra verrà codificata.

Quindi, finalmente urlencode alias in bash ha questo aspetto:

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

Esame 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 

Commenti

  • Non codifica le barre.
  • @Bevor : Esempio?
  • Aggiungi una barra a urlencode ” Проба пера ” – > risultato: Slash non è codificato.
  • @Bevor: hai ragione. Grazie per il tuo commento. Cambierò anche la mia risposta per riflettere il tuo commento al suo interno.

Risposta

GNU Awk

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

Risposta

E un altro approccio Perl:

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

Dovrai installare il modulo URI::Encode. Sulla mia Debian, potrei semplicemente eseguire

sudo apt-get install liburi-encode-perl 

Quindi, ho eseguito lo script sopra su un file di prova contenente:

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

Il risultato è stato (avevo salvato lo script come foo.pl):

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

Risposta

Una risposta nella shell (principalmente Posix):

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

Spiegazione:

  • -e "s/+/ /g trasforma ogni + nello spazio (come descritto nella norma di codifica URL)
  • -e "s/%\(..\)/\\\\x\1/g" trasforma ogni %XX in \\xXX. Si noti che uno di \ verrà rimosso citando le regole.
  • Il printf interno serve solo per passare linput a sed. Possiamo sostituirlo con qualsiasi altro meccanismo
  • Il printf esterno interpreta le \\xXX sequenze e mostra il risultato.

Modifica:

Poiché % deve sempre essere interpretato negli URL, è possibile semplificare questa risposta. Inoltre, penso che sia più pulito usare xargs invece di backquotes (grazie a @josch).

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

Sfortunatamente, (come ha notato @josch) nessuna di queste soluzioni è conforme a Posix poiché la \x sequenza di escape non è definita in Posix.

Commenti

  • Benvenuto in U & L. Forse potresti spiegare questa risposta e come funziona. In genere preferiamo che le nostre risposte siano lunghe con dettagli, non solo frammenti di codice.
  • Mi piace molto questa risposta perché ‘ è completa, portabile e non ‘ t richiede programmi esterni più pesanti come perl o python. Funziona bene per me.
  • Ottima soluzione. E ancora più breve e intelligente: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. Lopzione -e può essere omessa qui infatti …
  • @josch Hai ragione, printf è un è integrato in dash e ‘ t riconosce \x di escape. Puoi utilizzare /usr/bin/printf invece di printf per farlo funzionare. Normalmente dovresti essere in grado di utilizzare command printf, ma sembra che non funzioni come dovrebbe. Continua a utilizzare il built-in.
  • @Jezz infatti il supporto per \x escaping non fa parte di POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Durante i miei test ho visto un altro problema. Potresti sostituire la tua .. regex con [a-zA-Z0-9][a-zA-Z0-9] perché altrimenti inserisci ‘ %% % ‘ avrà esito negativo. Ho anche aggiunto s/%/%%/g alla fine per assicurarmi di evitare le percentuali per printf.

Risposta

Unaltra soluzione che utilizza ruby (la risposta Python accettata non funzionava per me)

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

Esempio

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

Commenti

  • Appena usato per ruby, e queste istruzioni sembrano più piccole. Inoltre, sono passato a ARGF.read in modo da poterlo reindirizzare come faccio con molte altre utilità!

Answer

Ecco una funzione BASH per fare esattamente questo:

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

Commenti

  • funziona come un fascino
  • Se desideri convertire + caratteri in spazi e non generare processi, puoi utilizzare questo: : "${1//+/ }" && echo -e "${_//%/\\x}"

Answer

Solo shell:

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

Aggiungi -- o %b per evitare che gli argomenti che iniziano con un trattino vengano trattati come opzioni.

In zsh ${x//%/a} aggiunge a alla fine ma ${x//\%/a} sostituisce % con a.

Risposta

Ecco le parti rilevanti di un altro script (che ho spudoratamente rubato dal mio script di download di youtube.com da unaltra risposta) lho già scritto. Utilizza sed e la shell per creare un urldecode funzionante.

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

Non giuro che sia completo – e in effetti ne dubito – ma sicuramente ha gestito abbastanza YouTube.

Answer

La semplice soluzione per short stringhe (la shell è lentawww):

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *