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

Я рекомендовал бы ls -al посмотрите, там ли файл также.

101
01.03.2015, 20:59
14 ответов

Нашел эти Python One Liners, которые делают то, что вы хотите:

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

Пример

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

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

Ссылки

113
27.01.2020, 19:30

Если вы хотите использовать простую команду 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 ...]

DESCRIPTION

    urlencode кодирует строки согласно RFC 1738.

    That is, characters A-Z a-z 0-9 . _ и - являются проходящие через немодифицированные, но все остальные символы представлены как %HH, где HH - их двузначное шестнадцатиричное ASCII представление. Например, URL http://www.gridpp.ac.uk/ становится http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode преобразует каждый символ во всех строках. данные в командной строке.  Если дано несколько строк, они соединены с разделительными промежутками перед преобразованием.

ВНИМАНИЕ
    -m
      Вместо полного преобразования, сделайте на GridSite "мягкую URL-кодировку". в которых A-Z a-z 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
10
27.01.2020, 19:30

Perl One Liner:

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

Пример:

$ echo '%21%22' |  perl -pe 's/\%(\w\w)/chr hex $1/ge'
!"
9
27.01.2020, 19:30

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

7
27.01.2020, 19:30

И еще один подход 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 liburi-encode-perl

, я запустил скрипт выше в тестовом файле, содержащий:

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

Результат был (я сохранил скрипт как Foo.pl ):

$ ./foo.pl
http://foo!asd#asd$&asd'asd(asd)
4
27.01.2020, 19:30

Вот являются соответствующими битами из другого сценария (что я просто бесстыдно украл из моего сценарий загрузки 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, конечно, достаточно.

1
27.01.2020, 19:30

Ответ в (в основном 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 . Обратите внимание, что один из \ будет удален путем цитирования правил.
  • Внутренний распечаток находится там, чтобы пройти ввод в SED. Мы можем заменить его любым другим механизмом
  • Внешний разъем \\ XXX последовательности и результат отображения.

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

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

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

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

3
27.01.2020, 19:30

Существует встроенная функция для этого в стандартной библиотеке 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, включая Bitebox.

18
27.01.2020, 19:30

Только для оболочки:

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

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

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

1
27.01.2020, 19:30

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

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

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


обновление 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
7
27.01.2020, 19:30

sed

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

$ 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

Bash

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

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() предполагает, что данные не содержат обратной косой черты.

Вот аналогичная версия Джоэла, найденная по адресу: https://github.com/sixarm/urldecode.sh


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
}

Найдено в gist-файле 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

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

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

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

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

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

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

См. также:


Связанные:

63
27.01.2020, 19:30

Вот функция BASH для выполнения именно этого:

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

Другое решение, использующее ruby ​​(принятый ответ python, у меня не работало)

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

Пример

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

$ urlencode 'q werty=/;'
q+werty%3D%2F%3B
4
27.01.2020, 19:30

Простое решение для коротких строк (оболочка работает медленноwww):

$ str='q+werty%3D%2F%3B'

$ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n"

q werty=/;
0
03.03.2020, 18:59

Теги

Похожие вопросы