URL 인코딩 디코딩(퍼센트 인코딩)

URL 인코딩 디코딩(퍼센트 인코딩)

URL 인코딩을 디코딩하고 싶습니다. 이를 수행하기 위한 내장 도구가 있습니까? 아니면 누군가가 sed이를 수행하기 위한 코드를 제공할 수 있습니까?

검색을 해보니unix.stackexchange.com인터넷에서 URL 인코딩을 디코딩하기 위한 명령줄 도구를 찾을 수 없습니다.

내가 원하는 것은 파일을 다음과 같이 편집하는 txt것뿐입니다.

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

등.

답변1

원하는 작업을 수행하는 Python oneliner를 찾아보세요.

파이썬2

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

파이썬3

$ 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

인용하다

답변2

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@isaac, 다음 구문을 사용합니다.

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

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()데이터에 백슬래시가 포함되어 있지 않다고 가정합니다.

Joel의 유사한 버전은 다음과 같습니다.https://github.com/sixarm/urldecode.sh


배쉬 +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용 gist 파일, 또한스택 오버플로.


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

노력하다익명의해결책:

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

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

노력하다스티븐 차제라스urlencode 솔루션:

awk -v RS='&#[0-9]+;' -v ORS= '1;RT{printf("%%%02X", substr(RT,3))}'

바라보다:awk printf를 사용하여 텍스트 URL 디코딩.

디코드 파일 이름

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

또한보십시오:


관련된:

답변3

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

파이썬 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.parse; 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 -pli -MURI::Escape -e '$_ = uri_unescape($_)' file

POSIX 이식 가능한 도구를 고수하려는 경우에는 어색합니다. 유일한 심각한 후보는 16진수를 구문 분석하지 않는 awk이기 때문입니다. 바라보다awk printf를 사용하여 텍스트 URL 디코딩예를 들어 일반적인 awk 구현에는 BusyBox가 포함됩니다.

답변4

간단한 명령을 사용하려면 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-clientsUbuntu/Debian 시스템)로 직접 설치할 수도 있습니다.

이름

    urlencode - 문자열을 URL 인코딩 형식으로 변환하거나 반대로 변환합니다.
요약

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

설명하다

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

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

    urlencode명령줄에 제공된 모든 문자열의 모든 문자를 변환합니다. 여러 문자열이 제공되면 변환하기 전에 구분 공백으로 연결됩니다.

옵션
    -m
      전체 변환은 아니지만 AZ az 0-9를 사용하는 GridSite "온건한 URL 인코딩"입니다. = - _ @ 및 /는 수정되지 않은 상태로 전달됩니다. 이렇게 하면 약간 이해하기 쉬운 문자열이 생성되지만 응용 프로그램은 슬래시가 암시하는 디렉터리를 생성하거나 에뮬레이트할 준비가 되어 있어야 합니다.
    -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

관련 정보