Decodificación de la codificación de URL (codificación porcentual)

Quiero decodificar la codificación de URL, ¿hay alguna herramienta incorporada para hacer esto o alguien podría proporcionarme un sed ¿código que hará esto?

Busqué un poco en unix.stackexchange.com y en Internet, pero no pude encontrar ninguna herramienta de línea de comandos para decodificar codificación de URL.

Lo que quiero hacer es simplemente editar un archivo txt para que:

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

Y así sucesivamente.

Comentarios

Respuesta

Encontré estos conceptos básicos de Python que hacen lo que quieres:

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

Ejemplo

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

Referencias

Comentarios

  • Lo sé muy tarde , pero ¿hay alguna forma de que pueda hacer esto con la edición en el lugar?
  • @DisplayName – suena como una nueva Q para mí. Yo ‘ lo pregunto y hago referencia a este.
  • 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]"
  • Vea la respuesta de @DIG mbl ‘ s baja para una que funcione con stdin.

Respuesta

sed

Pruebe la siguiente línea de comando:

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

o la siguiente alternativa usando echo -e:

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

Nota: Es posible que la sintaxis anterior no convierta + a espacios, y puede comerse todas las líneas nuevas.


Puede definirlo como alias y agregarlo a sus archivos shell rc :

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

Luego, cada vez que lo necesite, simplemente vaya con:

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

Bash

Al crear scripts, puede utilizar la siguiente sintaxis:

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

Sin embargo, la sintaxis anterior no «no maneja las ventajas (+) correctamente, por lo que debe reemplazarlos con espacios a través de sed o como lo sugiere @isaac , use la siguiente sintaxis:

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

También puede utilizar las siguientes funciones urlencode() y urldecode():

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

Tenga en cuenta que el urldecode() anterior asume que los datos no contienen barra invertida.

Aquí hay una versión similar de Joel que se encuentra en: https://github.com/sixarm/urldecode.sh


bash + xxd

Función Bash con xxd herramienta:

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 } 

Encontrado en cdown «s gist file , también en stackoverflow .


PHP

Usando PHP puede probar el siguiente comando:

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

o simplemente:

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

Utilice -R para la entrada de varias líneas.


Perl

En Perl usted puede usar URI::Escape .

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

O para procesar un archivo:

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

awk

Pruebe anon solución:

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

Nota: El parámetro -n es específico de GNU awk.

Consulte: Uso de awk printf para codificar texto con url .

decodificación de nombres de archivos

Si necesita eliminar la codificación de URL de los nombres de archivos, utilice la herramienta deurlname de renameutils (p. ej. deurlname *.*).

Consulte también:


Relacionado:

Comentarios

  • awk: ya que esto hace uso de una función de biblioteca, chr(), existe una alta probabilidad de que funcione únicamente en GNU awk (gawk). Sin embargo, en este caso, apenas habrá ningún equivalente para POSIX awk, porque la opción -n (que permite argumentos no decimales) ES una awk especialidad de GNU.
  • Sus soluciones que involucran printf no toman en cuenta que la URL puede contener signos de porcentaje de escape como %25. Los pasa a printf sin escapar de ellos para printf con otro signo de porcentaje como %%.
  • La versión bash requiere local LC_ALL=C en la parte superior; de lo contrario, todos los caracteres anchos (es decir, japonés, chino, etc.) no se dividen correctamente en bytes.
  • github.com/SixArm/ urlencode.sh
  • Las versiones de printf no ‘ no funcionan cuando se usa la versión BSD de printf (por ejemplo, macOS), sin embargo, funciona bien cuando se usa el Versión GNU Coreutils.

Respuesta

Hay una función incorporada para eso en la biblioteca estándar de Python. En Python 2, es «s urllib.unquote .

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

O para procesar un archivo:

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

En Python 3, es «s urllib.parse.unquote .

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

O para procesar un archivo:

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

En Perl puede usar URI::Escape .

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

O para procesar un archivo:

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

Si desea utilizar las herramientas portátiles POSIX, » Es incómodo, porque el único candidato serio es awk, que no analiza números hexadecimales. Consulte Uso de awk printf para codificar texto en URL para ver ejemplos con implementaciones de awk comunes, incluido BusyBox.

Respuesta

Perl one liner:

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

Ejemplo:

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

Comentarios

  • Esta respuesta es atractiva cuando no ‘ no quiere ocuparse de la instalación de módulos perl.
  • Solo uno que funcionó elegantemente para mí en MacOS.
  • Si desea resolver todos los niveles de codificación de URL a la vez, hay ‘ s también perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' que decodificará todas las %25xx codificaciones anidadas

Respuesta

Si desea utilizar un comando sed simplista, utilice lo siguiente:

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" 

Pero es más conveniente crear un script como (digamos sedscript):

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

Luego, ejecute sed -f sedscript < old > new, que generará la salida que desee.


Para mayor facilidad, el comando urlencode también está disponible directamente en gridsite-clients se puede instalar desde (por sudo apt-get install gridsite-clients en el sistema Ubuntu / Debian).

NAME

    urlencode – convierte cadenas hacia o desde un formato codificado en URL

SINOPSIS

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

DESCRIPCIÓN

    urlencode codifica cadenas de acuerdo con RFC 1738.

    Es decir, caracteres AZ az 09 . _ y - se pasan sin modificar, pero todos los demás caracteres se representan como% HH, donde HH es su dos-d igit representación ASCII hexadecimal en mayúsculas. Por ejemplo, la URL http://www.gridpp.ac.uk/ se convierte en http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode convierte cada carácter en todas las cadenas dadas en la línea de comando. Si se proporcionan varias cadenas, se concatenan con espacios de separación antes de la conversión.

OPCIONES

    -m

      En lugar de la conversión completa, utilice GridSite «codificación de URL moderada» en el que AZ az 0-9. = – _ @ y / se pasan sin modificar. Esto da como resultado cadenas un poco más legibles por humanos, pero la aplicación debe estar preparada para crear o simular los directorios implícitos en las barras.

    -d

      Realice la decodificación de URL en lugar de que la codificación, de acuerdo con RFC 1738. Las cadenas% HH y% hh se convierten y otros caracteres se pasan sin modificar, con la excepción de que + se convierte en espacio.

Ejemplo de decodificación de URL:

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

Comentarios

  • Para obtener un tutorial sobre sed visite
  • Esta es una mala solución, porque requiere codificar cada carácter. Este problema se ejemplifica por el hecho de que en su código falta la secuencia de escape %20 de uso frecuente.
  • @Overv I ‘ ve sólo Revisado
  • Además, es posible que desee volver a verificar qué hace s/%26/&/g. (Lo arreglé.)

Respuesta

No puedo comentar sobre la mejor respuesta en este hilo , así que aquí está la mía.

Personalmente, uso estos alias para codificar y decodificar URL:

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

Ambos comandos le permiten convertir datos, pasados como un argumento de línea de comando o leerlos desde entrada estándar , porque ambos conceptos básicos comprueban si hay argumentos en la línea de comandos (incluso vacíos) y los procesan o simplemente leen entrada estándar de lo contrario.


actualización 2017-05-23 (codificación de barra)

En respuesta al comentario de @Bevor.

Si también es necesario codificar la barra, solo agregue un segundo argumento vacío a la función de comillas, luego la barra también se codificará.

Entonces, finalmente urlencode alias en bash se ve así:

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 

Comentarios

  • No codifica barras.
  • @Bevor : ¿Ejemplo?
  • Agregar una barra al código urlen » Проба пера » – > resultado: la barra no está codificada.
  • @Bevor: Tienes razón. Gracias por tu comentario. También cambiaré mi respuesta para reflejar su comentario en ella.

Respuesta

GNU Awk

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

Respuesta

Y otro enfoque de Perl:

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

Necesitará instalar el módulo URI::Encode. En mi Debian, simplemente podría ejecutar

sudo apt-get install liburi-encode-perl 

Luego, ejecuté el script anterior en un archivo de prueba que contenía:

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

El resultado fue (había guardado el script como foo.pl):

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

Respuesta

Una respuesta en (principalmente Posix) shell:

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

Explicación:

  • -e "s/+/ /g transforma cada + en el espacio (como se describe en la norma de codificación de URL)
  • -e "s/%\(..\)/\\\\x\1/g" transforma cada %XX en \\xXX. Observe que uno de \ se eliminará citando reglas.
  • El printf interno está ahí para pasar la entrada a sed. Podemos reemplazarlo por cualquier otro mecanismo
  • El printf externo interpreta \\xXX secuencias y muestra el resultado.

Editar:

Dado que % siempre debe interpretarse en URL, es posible simplificar esta respuesta. Además, creo que es más limpio usar xargs en lugar de backquotes (gracias a @josch).

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

Desafortunadamente, (como notó @josch) ninguna de estas soluciones es compatible con Posix ya que la secuencia de escape \x no está definida en Posix.

Comentarios

  • Bienvenido a U & L. Quizás podrías explicar esta respuesta y cómo funciona. Por lo general, preferimos que nuestras respuestas sean extensas con detalles, no solo fragmentos de código.
  • Me gusta mucho esta respuesta porque ‘ es completa, portátil y no ‘ t requiere programas externos más pesados como perl o python. Funciona bien para mí.
  • Gran solución. E incluso más corto e inteligente: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. De hecho, la opción -e se puede omitir aquí …
  • @josch Tiene razón, printf es un integrado en dash y no ‘ t reconoce \x el escape. Puede usar /usr/bin/printf en lugar de printf para que funcione. Normalmente, debería poder utilizar command printf, pero parece que no funciona como debería. Continúa utilizando el sistema integrado.
  • @Jezz de hecho, el soporte para \x El escape no es parte de POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Durante mis pruebas vi otro problema. Es posible que desee reemplazar su .. expresión regular por [a-zA-Z0-9][a-zA-Z0-9] porque de lo contrario ingrese como ‘ %% % ‘ fallará. También agregué s/%/%%/g al final para asegurarme de escapar de los porcentajes para printf.

Respuesta

Otra solución usando ruby (la respuesta de Python aceptada no funcionaba para mí)

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

Ejemplo

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

Comentarios

  • Solo solía usar ruby, y estas declaraciones parecen más pequeñas. Además, cambié a ARGF.read para poder integrarlo como lo hago con muchas otras utilidades.

Responder

Aquí hay una función BASH para hacer exactamente eso:

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

Comentarios

  • funciona a la perfección
  • Si desea convertir + caracteres a espacios y no generar ningún proceso, puede usar esto: : "${1//+/ }" && echo -e "${_//%/\\x}"

Respuesta

Solo shell:

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

Agregar -- o %b para evitar que los argumentos que comienzan con un guión se traten como opciones.

En zsh ${x//%/a} agrega a al final, pero ${x//\%/a} reemplaza % por a.

Respuesta

Aquí están los bits relevantes de otro script (que simplemente robé de mi youtube.com descargar script de otra respuesta) que he escrito antes. Utiliza sed y el shell para crear un código de URL que funcione.

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

No juro que sea completo – y de hecho lo dudo – pero manejó YouTube con bastante seguridad.

Respuesta

La solución simple para cadenas cortas (el shell es lentowww):

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *