명령 행에서 퍼센트로 인코딩 된 문자열을 어떻게 인코딩하고 디코딩 할 수 있습니까?


31

명령 행에서 퍼센트 인코딩 (URL 인코딩) 문자열을 어떻게 인코딩하고 디코딩 할 수 있습니까?

이 작업을 수행 할 수있는 솔루션을 찾고 있습니다.

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük

다른 인코딩도 포함하고 싶습니까? %E6ndr%FCk나에게 (표준) UTF8처럼 ​​보이지 않습니다. 아니면 예일 뿐입니 까?
정렬

@arrange 감사합니다. 분명히 나는 온라인 변환기에 대한 검색 결과 에서 나쁜 사과를 선택했습니다 .
ændrük

답변:


35

이 명령은 원하는 것을 수행합니다.

python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6

당신이로 인코딩 공간을 원하는 경우 +, 교체 urllib.quote와 함께 urllib.quote_plus.

나는 당신이 그것들의 별칭 을 원할 것이라고 추측하고 있다 ;-)


1
첫 번째 줄의 끝에서 그 문자는 무엇입니까? 편집 : 나 자신에게 대답-그것을 얻었다, 그것은 단지 목적을 위해 단일 문자 UTF8 인코딩 될 문자열입니다 :-)
TMG

1
python3는 어떻습니까?
RicardoE

@RicardoE 이 답변을 확인 하십시오 .
Pablo A

27

껍질

다음 명령 행을 시도하십시오.

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük

별명으로 정의하여 쉘 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

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


파이썬

다음 별명을 정의하십시오.

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

용법:

$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük

출처 : ruslanspivak


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

sed

다음을 사용하여 sed사용할 수 있습니다.

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

어 wk

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

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

awk printf를 사용하여 텍스트를 urldecode 참조하십시오 .


파일 이름 디코딩

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

참조 :


관련 :


배쉬 + xxd 버전이 포함되어 문자열을 작동하지 않는 %, 어쩌면 당신은 대체 할 수 printf "$c"와 함께 printf "%c" "$c"? 또 다른 문제는 ä일부 언어 설정에서 일부 비 ASCII 문자가 인코딩되지 않는다는 것입니다 (예 :) export LC_ALL=C.
12431234123412341234123

8

예약 인코딩 된 URI 문자 및 비 ASCII 문자

jq -s -R -r @uri

-s( --slurp)는 입력 행을 배열로 읽고 -s -R( --slurp --raw-input)는 입력을 단일 문자열로 읽습니다. -r(--raw-output )는 JSON 문자열 리터럴 대신 문자열의 내용을 출력합니다.

모든 문자의 퍼센트 인코딩

xxd -p|tr -d \\n|sed 's/../%&/g'

tr -d \\nxxd -p60 자마다 추가되는 줄 바꿈을 제거합니다 .

Bash에서 ASCII 영숫자를 제외한 모든 문자의 백분율 인코딩

eu () {
    local LC_ALL=C c
    while IFS= read -r -n1 -d '' c
    do 
        if [[ $c = [[:alnum:]] ]]
        then 
            printf %s "$c"
        else
            printf %%%02x "'$c"
        fi
    done
}

그렇지 않으면 -d ''줄 바꿈과 null 바이트를 건너 뜁니다. IFS=이것이 없으면 문자가로 대체 IFS됩니다 %00. 없이 LC_ALL=C이 예를 들어 대체 할 %3042수정 UTF-8 로켈에서.


5

디코딩 전용 순수 bash 솔루션 :

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük

4

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

개인적으로 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])"'

두 명령 모두 데이터를 변환 하거나 명령 줄 인수로 전달 하거나 표준 입력 에서 읽습니다. 두 줄 모두 명령 줄 인수 (빈 항목 포함)가 있는지 확인하고 처리하거나 표준 입력을 읽지 않기 때문입니다.

2015-07-16 업데이트 (빈 1 번째 인수)

... @muru 의견에 따르면.

2017-05-28 업데이트 (슬래시 인코딩)

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

따라서 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
나는 sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1]더 적절 하다고 생각 합니다. 특히 스크립트에서 이것을 사용하고 실수로 빈 첫 번째 인수를 제공하는 경우.
muru

@muru 주석에 따라 명령 줄에서 인수 검사를 변경했습니다. : 그것은이었다 len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] : 이제 sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] 심지어 빈 첫 번째 인자가있는 경우, 즉, 명령은 표준 입력에서 입력을 기다리지 않습니다 만, 빈 인수를 처리합니다.
DIG mbl

2

"퍼센트 인코딩 된"문자를 포함하는 파일의 이름을 바꿀 수 renameutils있는 유틸리티가 포함 된 패키지를 찾았습니다 deurlname.

불행하게도, stdin 또는 명령 행 옵션을 디코딩하지 않고 파일 이름 만 바꾸므로 디코딩을 위해 더미 파일을 작성해야합니다 (이름이 바뀐 파일 이름). 그러나 일부 bash 스크립트를 사용하면 프로세스를 자동화 할 수 있습니다 .

인코딩 할 문자가 문제가 될 수 있기 때문에 인코딩 부분에 대한 정보가 없습니다. 비 ASCII 만?

더 나은 도구 / 방법이 있어야한다고 생각합니다.


1

Stefano ansqer 와 유사 하지만 Python 3에서는 :

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" æ
python -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6

슬래시도 인코딩하려면 다음을 수행하십시오.

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

차이점에 대한 자세한 내용은 여기를 참조하십시오 .


0

인코딩을위한 POSIX Awk 함수는 다음과 같습니다.

function encodeURIComponent(str, j, q) {
  while (y++ < 125) z[sprintf("%c", y)] = y
  while (y = substr(str, ++j, 1))
    q = y ~ /[[:alnum:]_.!~*\47()-]/ ? q y : q sprintf("%%%02X", z[y])
  return q
}

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