디코딩 URL 인코딩 (백분율 인코딩)


100

URL 인코딩을 해독하고 싶습니다.이 작업을 수행하기위한 기본 제공 도구가 sed있습니까? 아니면 누구나이 작업을 수행 할 코드를 제공 할 수 있습니까?

unix.stackexchange.com 및 인터넷을 통해 조금 검색 했지만 URL 인코딩을 디코딩하는 명령 줄 도구를 찾을 수 없었습니다.

내가하고 싶은 일은 단순히 txt파일을 편집하여 간단히 편집하는 것입니다.

  • %21 된다 !
  • %23 된다 #
  • %24 된다 $
  • %26 된다 &
  • %27 된다 '
  • %28 된다 (
  • %29 된다 )

등등.


답변:


107

원하는 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

참고 문헌


나는 이것을 매우 늦게 알고 있지만 제자리에서 편집 할 수있는 방법이 있습니까?
DisplayName

@DisplayName-나에게 새로운 Q처럼 들린다. 물어보고 이것을 참조하십시오.
slm

15
스트리밍 :cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
kirill_igum

5
이것은 Python 2입니다. python기본적으로 3 인 시스템에서는 오류가 발생합니다. 변경 python하는 것은 python2도움이됩니다.
Ivan Kolmychek

4
들어 python3당신이 사용할 수있는 import urllib.parse as ul대신에 import urllib as ul.
ibotty

61

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

세게 때리다

스크립팅 할 때 다음 구문을 사용할 수 있습니다.

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 에서 비슷한 Joel의 버전이 있습니다.


bash + xxd

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의 요지 파일 도에서 유래 .


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에서는을 사용할 수 있습니다 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

어 wk

Anon 솔루션을 사용해보십시오 .

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

참고 : 매개 변수 -n는 GNU에만 해당됩니다 awk.

참조 : 텍스트를 URLDECODE하는 AWK printf의 사용 .

파일 이름 디코딩

파일 이름에서 URL 인코딩을 제거해야하는 경우 deurlname도구 renameutils(예 :)를 사용 deurlname *.*하십시오.

또한보십시오:


관련 :


1
awk: 이것은 라이브러리 함수를 사용하므로 chr()GNU awk ( gawk) 에서만 작동 할 가능성이 높습니다 . 그러나이 경우 POSIX에 대한 거의 동등한있을 것 awk때문에, -n(비 소수점 인수를 허용) 옵션은 IS 는 GNU awk전문.
구문 오류

첫 번째 sed코드는 xargs: argument line too long≥2164 줄의 파일을 제공합니다.
Sparhawk

2
관련된 솔루션 printf에는 URL과 같은 이스케이프 백분율 기호가 포함될 수 있음을 고려하지 않습니다 %25. 다음과 같은 다른 백분율 기호로 printf를 이스케이프하지 않고 printf로 전달합니다 %%.
josch

1
bash 버전은 local LC_ALL=C맨 위에 필요합니다 . 그렇지 않으면 모든 넓은 문자 (예 : 일본어, 중국어 등)가 바이트로 제대로 분리되지 않습니다.
Phernost


18

파이썬 표준 라이브러리에는 내장 함수가 있습니다. 파이썬 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

파이썬 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 휴대용 도구를 고수하려면 16 진수를 구문 분석하지 않는 유일한 심각한 후보가 awk이기 때문에 어색합니다. BusyBox를 포함한 일반적인 awk 구현의 예제는 awk printf를 사용하여 텍스트를 URL 디코딩하는 방법을 참조하십시오 .


10

간단한 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원하는대로 출력합니다.


쉽게, 명령 urlencodegridsite-clients패키지 에서 직접 사용할 수 있습니다 ( sudo apt-get install gridsite-clientsUbuntu / Debian 시스템에서).

이름

    urlencode-문자열을 URL 인코딩 형식으로 변환
개요

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

기술

    urlencode RFC 1738에 따라 문자열을 인코딩합니다.

    즉, 자 A- Z a- z 0- 9 . _-수정되지 않은 통과하지만, 다른 모든 문자는 HH가 두 자리 대문자 진수 ASCII 표현입니다 % HH로 표시됩니다. 예를 들어 URL http://www.gridpp.ac.uk/http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode명령 행에 제공된 모든 문자열에서 각 문자를 변환합니다. 여러 개의 문자열이 제공되면 변환 전에 공백을 분리하여 연결합니다.

옵션
    -m
      전체 변환 대신 AZ az 0-9 인 GridSite "mild URL encoding"을 수행하십시오. =-_ @ 및 /는 수정되지 않은 상태로 전달됩니다. 이렇게하면 사람이 읽을 수있는 문자열이 약간 더 많아 지지만 슬래시로 암시 된 디렉토리를 만들거나 시뮬레이션 할 수 있도록 응용 프로그램을 준비해야합니다.
    -d
      RFC 1738에 따라 인코딩 대신 URL 디코딩 +을 수행하십시오. 공백으로 변환 되는 예외를 제외하고 % 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


4
모든 문자를 하드 코딩해야하므로 나쁜 해결책입니다. 이 문제는 코드에서 자주 사용되는 %20이스케이프 시퀀스가 누락되어 나타납니다 .
Overv

@Overv 방금 수정했습니다
Pandya

또한 무엇을 다시 확인하고 싶을 수도 있습니다 s/%26/&/g. (나는 고쳤다.)
G-Man

9

펄 원 라이너 :

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

예:

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

1
이 대답은 펄 모듈 설치를 다루고 싶지 않을 때 매력적입니다.
Sridhar Sarnobat

1
MacOS에서 나에게 우아하게 일한 사람 만.
Qix


7

이 스레드 에서 가장 좋은 답변에 대해서는 언급 할 수 없으므로 여기에 있습니다.

개인적으로 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의 의견에 대한 답변.

슬래시도 인코딩 해야하는 경우 인용 함수에 빈 두 번째 인수를 추가하면 슬래시도 인코딩됩니다.

따라서 bash의 urlencode 별칭 은 다음과 같습니다.

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

1
슬래시를 인코딩하지 않습니다.
Bevor

@Bevor : 예?
DIG mbl

urlencode "Проба пера"-> 결과에 슬래시 추가 : 슬래시는 인코딩되지 않습니다.
Bevor

1
@Bevor : 네 말이 맞아. 당신의 의견에 감사드립니다. 또한 귀하의 의견을 반영하기 위해 답변을 변경하겠습니다.
DIG mbl

4

그리고 또 다른 Perl 접근법 :

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

    print $uri->decode($_)
}

URI::Encode모듈 을 설치해야 합니다. 데비안에서는 간단히 실행할 수있었습니다.

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)

3

(대부분 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 대신 사용하는 것이 더 깨끗하다고 ​​생각합니다 (@josch 덕분에).

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

불행히도 (@josch에서 알 수 있듯이) \x이스케이프 시퀀스는 Posix에 정의되어 있지 않으므로 Posix를 준수하는 솔루션 은 없습니다.


U & L에 오신 것을 환영합니다. 아마도이 답변과 작동 방식을 설명 할 수 있습니다. 우리는 일반적으로 코드 스 니펫뿐만 아니라 세부 사항이있는 긴 형식의 답변을 선호합니다.
slm

나는이 답변이 포괄적이고 휴대 가능하며 perl 또는 python과 같은 더 무거운 외부 프로그램이 필요하지 않기 때문에 정말 좋아합니다. 나를 위해 잘 작동합니다.
Steve Wills

1
훌륭한 솔루션. 그리고 더 짧고 똑똑 ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'합니다. 이 -e옵션은 실제로 생략 될 수 있습니다 ...
syntaxerror

1
@josch 당신이 옳고 printf내장되어 있으며 탈출을 dash인식하지 못합니다 \x. 작동시키기 위해 /usr/bin/printf대신에 사용할 수 있습니다 printf. 일반적으로을 사용할 수 command printf는 있지만 제대로 작동하지 않는 것 같습니다. 계속 내장되어 있습니다.
Jérôme Pouiller

1
@Jezz 참으로 지원 \x탈출은 POSIX의 일부가 아닙니다 : pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html 내 테스트를하는 동안 나는 또 다른 문제를 보았다. 그렇지 않으면 '%%%'와 같은 입력이 실패하기 때문에 ..정규식 을 바꿀 수 있습니다 [a-zA-Z0-9][a-zA-Z0-9]. 또한 s/%/%%/gprintf에 대한 백분율을 이스케이프 처리하기 위해 끝에 추가 했습니다.
josch

1

쉘 전용 :

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

대시로 시작하는 인수가 옵션으로 처리되지 않도록 --또는 추가하십시오 %b.

zsh ${x//%/a}에서는 a끝에 추가 하지만로 ${x//\%/a}대체 %됩니다 a.


1

다음은 이전에 작성한 다른 스크립트의 관련 비트입니다 ( 다른 답변의 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

정확하게 수행하는 BASH 함수는 다음과 같습니다.

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

매력처럼 작동
AbdElraouf Sabri

0

루비를 사용하는 또 다른 솔루션 (허용 된 파이썬 답변이 작동하지 않았습니다)

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.