Декодирование кодировки URL (процентное кодирование)

Я хочу декодировать кодировку URL, есть ли встроенный инструмент для этого, или кто-нибудь может предоставить мне sed код, который это сделает?

Я искал немного через unix.stackexchange.com и в Интернете, но я не смог найти инструмент командной строки для декодирования кодировки url.

Я хочу сделать просто редактирование файла txt чтобы:

  • %21 становится !
  • %23 становится #
  • %24 становится $
  • %26 становится &
  • %27 становится '
  • %28 становится (
  • %29 становится )

И так далее.

12 Solutions collect form web for “Декодирование кодировки URL (процентное кодирование)”

Нашли эти Python один лайнер, который делает то, что вы хотите:

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

пример

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

Рекомендации

  • Urlencode и urldecode из командной строки

СЕПГ

Попробуйте следующую командную строку:

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

или следующий альтернативный вариант с использованием echo -e :

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

Примечание. Вышеупомянутый синтаксис не может преобразовывать + в пробелы и может использовать все новые строки.


Вы можете определить его как псевдоним и добавить его в файлы оболочки rc :

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

Затем каждый раз, когда вам это нужно, просто зайдите:

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

удар

При написании сценариев вы можете использовать следующий синтаксис:

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

Однако выше синтаксис не будет корректно обрабатывать плюсы ( + ), поэтому вы должны заменить их пробелами через sed .

Вы также можете использовать следующие функции urlencode() и 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}" } 

Обратите внимание, что ваш urldecode () предполагает, что данные не содержат обратную косую черту.


bash + xxd

Функция Bash с инструментом 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 } 

Найдено в основном файле cdown , также в stackoverflow .


PHP

С помощью PHP вы можете попробовать следующую команду:

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

или просто:

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

Используйте -R для ввода нескольких строк.


Perl

В Perl вы можете использовать URI::Escape .

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

Или обрабатывать файл:

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

AWK

Попробуйте одно решение:

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

Примечание. Параметр -n специфичен для GNU awk .

См .: Использование awk printf для текста urldecode .

декодирование имен файлов

Если вам нужно удалить кодировку url из имен файлов, используйте инструмент renameutils из renameutils (например, deurlname *.* ).

Смотрите также:

  • Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме?
  • Как удалить кодировку URI из имен файлов?

Связанный:

  • Как декодировать строку в кодировке URL в оболочке? на SO
  • Как я могу кодировать и декодировать процентные строки в командной строке? в Ask Ubuntu

Для стандартной библиотеки Python существует встроенная функция. В Python 2 это urllib.unquote .

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

Или обрабатывать файл:

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

В Python 3 это urllib.parse.unquote .

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

Или обрабатывать файл:

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

В Perl вы можете использовать URI::Escape .

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

Или обрабатывать файл:

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

Если вы хотите использовать переносные инструменты POSIX, это неудобно, потому что единственным серьезным кандидатом является awk, который не анализирует шестнадцатеричные числа. См. Использование awk printf для текста urldecode для примеров с общими реализациями awk, включая BusyBox.

Если вы хотите использовать простодушную команду sed , используйте следующее:

 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' 

Но удобнее создавать сценарий вроде (например, sedscript ):

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

Затем запустите sed -f sedscript < old > new , который будет выводиться по вашему желанию.


Для удобства команда urlencode также доступна непосредственно в gridsite-clients который может быть установлен с помощью ( sudo apt-get install gridsite-clients в системе Ubuntu / Debian).

ИМЯ

    urlencode – преобразовывать строки в или из URL-кодированной формы

СИНТАКСИС

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

ОПИСАНИЕ

    urlencode кодирует строки в соответствии с RFC 1738.

То есть символы AZ az 09 . _ и - передаются через немодифицированные, но все остальные символы представлены как% HH, где HH – их двузначное шестнадцатеричное представление ASCII в верхнем регистре. Например, URL http://www.gridpp.ac.uk/ становится http%3A%2F%2Fwww.gridpp.ac.uk%2F

urlencode преобразует каждый символ во все строки, указанные в командной строке. Если заданы несколько строк, они конкатенируются с разделительными пространствами перед преобразованием. ОПЦИИ

    -m
    Вместо полного преобразования сделайте GridSite «мягкое кодирование URL», в котором AZ az 0-9. = – _ @ и / проходят через немодифицированные. Это приводит к получению более удобных для чтения строк, но приложение должно быть подготовлено для создания или моделирования каталогов, подразумеваемых любыми косыми чертами.

-d

    В отличие от кодирования, кодирование URL-адресов, в соответствии с RFC 1738. Преобразуются строки% HH и% hh, а другие символы передаются через немодифицированные данные, за исключением того, что + преобразуется в пробел.

Пример декодирования URL:

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

GNU awk

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

Или

 #!/bin/sh awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%.. 

Преобразовать URL-адрес, закодированный в процентах, в локальный файл в bash

Perl один вкладыш:

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

Пример:

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

И еще один подход Perl:

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

Вам нужно будет установить модуль URI::Encode . На моем Debian я мог просто запустить

 sudo apt-get install URI::Encode 

Затем я выполнил сценарий выше в тестовом файле, содержащем:

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

В результате я сохранил скрипт как foo.pl ):

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

Ответ в оболочке (в основном Posix):

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

Объяснение:

  • -e 's/+/ /g преобразует каждый + в пространстве (как описано в норме кодирования url)
  • -e 's/%\(..\)/\\\\x\1/g' преобразуем каждый %XX в \\xXX . Обратите внимание, что один из \ будет удален правилами цитирования.
  • Внутренний printf находится здесь, чтобы передать вход в sed. Мы можем заменить его каким-либо другим механизмом
  • Внешняя printf интерпретирует последовательности \\xXX и результат отображения.

Редактировать:

Поскольку % всегда следует интерпретировать в URL-адресах, можно упростить этот ответ. В добавлении, я думаю, что xargs использовать xargs вместо xargs (спасибо @josch).

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

К сожалению, (как заметил @josch) ни одно из этих решений не совместимо с Posix, так как \x escape-последовательность не определена в Posix.

Я не могу комментировать лучший ответ в этой теме , так что вот мой.

Лично я использую эти псевдонимы для кодирования и декодирования 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])"' 

Обе команды позволяют вам преобразовывать данные, передаваться в качестве аргумента командной строки или читать их со стандартного ввода , потому что оба однострочника проверяют наличие аргументов командной строки (даже пустых) и обрабатывают их или просто читают стандартный ввод в противном случае.


update 2017-05-23 (косой чертой)

В ответ на комментарий @ Bevor.

Если вам также нужно закодировать косую черту, просто добавьте пустой аргумент в функцию котировки, тогда косая черта также будет закодирована.

Итак, наконец, псевдоним urlencode в bash выглядит следующим образом:

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

пример

 $ 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 

Shell только:

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

Добавить -- или %b чтобы предотвратить аргументы, начинающиеся с тире от обработки как параметров.

В zsh ${x//%/a} добавляется a до конца, но ${x//\%/a} заменяет % на a .

Вот соответствующие биты из другого сценария (который я просто бесстыдно украл из моего сценария загрузки youtube.com из другого ответа), который я написал ранее. Он использует sed и оболочку для создания рабочего urldecode.

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

Я не поклянусь, что он всеобъемлющий – и на самом деле я сомневаюсь, но он справился с youtube, конечно, достаточно.

Вот функция BASH, чтобы сделать именно это:

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

помог мне. надеюсь, это поможет вам.

  • Nginx wordpress и неправильный путь
  • Скажите wget, чтобы он не попадал в URL-адрес, соответствующий шаблону?
  • Wget не будет рекурсивно загружать
  • URL Rewrite на debian не работает
  • Что не так с обработкой URI в Linux Mint?
  • Firefox отбрасывает URL-адрес, когда время подключения к серверу или неудача
  • Проблема с кодировкой url в debian sources.list
  • sed заменить текст url на html url
  • source.list URL-адрес репозитория для обновлений безопасности Debian с или без пути «debian-security»?
  • Thunderbird: переносить длинные URL-адреса при отображении сообщения
  • Есть ли графический инструмент для добавления новых схем URL, таких как XX: //?
  • Linux и Unix - лучшая ОС в мире.