Codificação de URL de decodificação (codificação percentual)

Quero decodificar a codificação de URL, existe alguma ferramenta integrada para fazer isso ou alguém poderia me fornecer um div id = “ae75b1150b”>

código que fará isso?

Eu pesquisei um pouco em unix.stackexchange.com e na internet, mas não consegui encontrar nenhuma ferramenta de linha de comando para decodificação codificação de url.

O que eu quero fazer é simplesmente editar um arquivo txt para que:

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

E assim por diante.

Comentários

Resposta

Encontrou estes liners Python que fazem o que você quer:

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

Exemplo

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

Referências

Comentários

  • Eu sei disso muito tarde , mas há alguma maneira de fazer isso com a edição local?
  • @DisplayName – soa como um novo Q para mim. Eu ‘ d pergunto e faço referência 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]"
  • Veja @DIG mbl ‘ a resposta para aquele que trabalha com stdin.

Resposta

sed

Tente a seguinte linha de comando:

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

ou a seguinte alternativa usando echo -e:

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

Observação: a sintaxe acima não pode converter + para espaços e pode comer todas as novas linhas.


Você pode defini-lo como um alias e adicioná-lo aos arquivos rc do shell:

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

Então, sempre que precisar, basta ir com:

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

Bash

Ao criar scripts, você pode usar a seguinte sintaxe:

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

No entanto, a sintaxe acima não “lida com vantagens (+) corretamente, então você deve substituí-los por espaços via sed ou conforme sugerido por @isaac , use a seguinte sintaxe:

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

Você também pode usar as seguintes funções urlencode() e 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}" } 

Observe que urldecode() assume que os dados não contêm barra invertida.

Aqui está a versão semelhante de Joel, encontrada em: https://github.com/sixarm/urldecode.sh


bash + xxd

Função Bash com a xxd ferramenta:

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 no cdown “arquivo principal , também em stackoverflow .


PHP

Usando PHP, você pode tentar o seguinte comando:

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

ou apenas:

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

Use -R para entrada de várias linhas.


Perl

Em Perl você pode usar URI::Escape .

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

Ou para processar um arquivo:

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

awk

Tente anon solução:

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

Observação: o parâmetro -n é específico do GNU awk.

Veja: Usando awk printf para urldecode texto .

decodificar nomes de arquivo

Se você precisar remover a codificação de url dos nomes de arquivo, use a ferramenta deurlname de renameutils (por exemplo deurlname *.*).

Veja também:


Relacionado:

Comentários

  • awk: Como isso faz uso de uma função de biblioteca, chr(), há uma grande probabilidade de que funcione apenas no GNU awk (gawk). No entanto, neste caso, dificilmente haverá qualquer equivalente para POSIX awk, porque a opção -n (permitindo argumentos não decimais) É uma especialidade GNU awk.
  • Suas soluções envolvendo printf não levam em consideração que o url pode conter sinais de porcentagem de escape como %25. Você os passa para printf sem escapar deles para printf com outro sinal de porcentagem como %%.
  • A versão bash requer local LC_ALL=C na parte superior, caso contrário, todos os caracteres largos (ou seja, japonês, chinês etc.) não serão divididos em bytes.
  • github.com/SixArm/ urlencode.sh
  • As versões printf não ‘ não funcionam ao usar a versão BSD de printf (por exemplo, macOS), no entanto, funciona bem ao usar o Versão GNU Coreutils.

Resposta

Há uma função embutida para isso na biblioteca padrão do Python. No Python 2, é “s urllib.unquote .

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

Ou para processar um arquivo:

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

No Python 3, é “s urllib.parse.unquote .

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

Ou para processar um arquivo:

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

Em Perl, você pode usar URI::Escape .

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

Ou para processar um arquivo:

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

Se você quiser usar as ferramentas portáteis POSIX, ” é estranho, porque o único candidato sério é estranho, que não analisa números hexadecimais. Veja Usando awk printf para urldecode texto para exemplos com implementações comuns de awk, incluindo BusyBox.

Resposta

Perl one liner:

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

Exemplo:

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

Comentários

  • Essa resposta é atraente quando você não ‘ quer lidar com a instalação de módulos perl.
  • Apenas um que funcionou elegantemente para mim no MacOS.
  • Se você deseja resolver todos os níveis de codificação de URL de uma vez, existe ‘ s também perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);' que decodificará todas as %25xx codificações aninhadas

Resposta

Se você deseja usar um comando sed simplório, use o seguinte:

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" 

Mas é mais conveniente criar um 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  

Em seguida, execute sed -f sedscript < old > new, que terá a saída desejada.


Para facilitar, o comando urlencode também está disponível diretamente em gridsite-clients pode ser instalado de (por sudo apt-get install gridsite-clients no sistema Ubuntu / Debian).

NOME

    urlencode – converte strings de ou para a forma codificada por URL

SINOPSE

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

DESCRIÇÃO

    urlencode codifica strings de acordo com RFC 1738.

    Ou seja, caracteres AZ az 09 . _ e - são passados sem modificações, mas todos os outros caracteres são representados como% HH, onde HH é seu dois-d representação ASCII hexadecimal em maiúsculas igit. Por exemplo, o URL http://www.gridpp.ac.uk/ torna-se http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode converte cada caractere em todas as strings fornecidas na linha de comando. Se várias strings forem fornecidas, elas serão concatenadas com espaços de separação antes da conversão.

OPÇÕES

    -m

      Em vez de conversão completa, faça GridSite “codificação moderada de URL” em que AZ az 0-9. = – _ @ e / são passados sem modificações. Isso resulta em strings mais legíveis por humanos, mas o aplicativo deve estar preparado para criar ou simular os diretórios implícitos em quaisquer barras.

    -d

      Em vez disso, decodificação do que a codificação, de acordo com a RFC 1738. As strings% HH e% hh são convertidas e outros caracteres são passados sem modificações, com a exceção de que + é convertido em espaço.

Exemplo de URL de decodificação:

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

Comentários

  • Para tutorial sobre sed visite
  • Esta é uma solução ruim, porque requer codificar todos os caracteres. Este problema é exemplificado por seu código sem a sequência de escape %20 frequentemente usada.
  • @Overv I ‘ ve apenas Revisado
  • Além disso, você pode querer verificar novamente o que s/%26/&/g faz. (Eu corrigi.)

Resposta

Não posso “comentar melhor resposta neste tópico , então aqui está a minha.

Pessoalmente, eu uso estes aliases para codificação e decodificação de 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 os comandos permitem que você converta dados, passados como um argumento de linha de comando ou leia-os de entrada padrão , porque ambos verificam se há argumentos de linha de comando (mesmo os vazios) e os processam ou apenas lêem entrada padrão caso contrário.


update 2017-05-23 (codificação de barra)

Em resposta ao comentário de @Bevor.

Se você também precisa codificar a barra, basta adicionar um segundo argumento vazio à função de aspas, então a barra também será codificada.

Então, finalmente urlencode alias em bash se parece com isto:

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

Exame 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 

Comentários

  • Não codifica barras.
  • @Bevor : Exemplo?
  • Adicionar uma barra ao urlencode ” Проба пера ” – > resultado: a barra não está codificada.
  • @Bevor: Você está certo. Obrigado pelo seu comentário. Eu também mudarei minha resposta para refletir seu comentário nela.

Resposta

GNU Awk

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

Resposta

E outra abordagem Perl:

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

Você precisará instalar o módulo URI::Encode. No meu Debian, eu poderia simplesmente executar

sudo apt-get install liburi-encode-perl 

Então, executei o script acima em um arquivo de teste contendo:

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

O resultado foi (salvei o script como foo.pl):

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

Resposta

Uma resposta em shell (principalmente Posix):

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

Explicação:

  • -e "s/+/ /g transforma cada + no espaço (conforme descrito na norma de codificação de url)
  • -e "s/%\(..\)/\\\\x\1/g" transforme cada %XX em \\xXX. Observe um dos \ será removido citando as regras.
  • O printf interno está lá apenas para passar a entrada para o sed. Podemos substituí-lo por qualquer outro mecanismo
  • O printf externo interpreta \\xXX sequências e exibe o resultado.

Editar:

Uma vez que % deve sempre ser interpretado em URLs, é possível simplificar esta resposta. Além disso, acho mais limpo usar xargs em vez de crases (graças a @josch).

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

Infelizmente, (como @josch notou) nenhuma dessas soluções é compatível com Posix, pois a \x sequência de escape não está definida em Posix.

Comentários

  • Bem-vindo a U & L. Talvez você possa explicar essa resposta e como ela funciona. Geralmente preferimos que nossas respostas sejam longas, com detalhes, não apenas trechos de código.
  • Gosto muito dessa resposta porque ‘ é abrangente, portátil e não ‘ t requerem programas externos mais pesados como perl ou python. Funciona bem para mim.
  • Ótima solução. E ainda mais curto e inteligente: ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'. A opção -e pode ser omitida aqui na verdade …
  • @josch Você está certo, printf é um integrado em dash e não ‘ não reconhece \x escape. Você pode usar /usr/bin/printf em vez de printf para fazê-lo funcionar. Normalmente, você deve poder usar command printf, mas parece não funcionar como deveria. Ele continua a usar integrado.
  • @Jezz de fato, o suporte para \x escape não faz parte do POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Durante meus testes, percebi outro problema. Você pode querer substituir seu .. regex por [a-zA-Z0-9][a-zA-Z0-9], caso contrário, insira como ‘ %% % ‘ irá falhar. Eu também adicionei s/%/%%/g no final para garantir que as porcentagens de escape para printf.

Resposta

Outra solução usando ruby (a resposta aceita do Python não estava funcionando para mim)

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

Exemplo

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

Comentários

  • Acabei de usar o Ruby, e essas declarações parecem menores. Além disso, mudei para ARGF.read para poder canalizá-lo como faço com muitos outros utilitários!

Resposta

Aqui está uma função BASH para fazer exatamente isso:

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

Comentários

  • funciona perfeitamente
  • Se você deseja converter + caracteres em espaços e não gerar nenhum processo, você pode usar isto: : "${1//+/ }" && echo -e "${_//%/\\x}"

Resposta

Somente shell:

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

Adicione -- ou %b para evitar que os argumentos que começam com um travessão sejam tratados como opções.

Em zsh ${x//%/a} adiciona a ao final, mas ${x//\%/a} substitui % por a.

Resposta

Aqui estão as partes relevantes de outro script (que eu descaradamente roubou meu script de download do youtube.com de outra resposta) que escrevi antes. Ele usa sed e o shell para construir um urldecode funcional.

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

Não juro que é abrangente – e na verdade eu duvido – mas segurou o YouTube com certeza o suficiente.

Resposta

A solução simples para strings curtas (o shell é lentowww):

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *