डिकोडिंग URL एन्कोडिंग (प्रतिशत एन्कोडिंग)


100

मैं URL एन्कोडिंग को डीकोड करना चाहता हूं, क्या ऐसा करने के लिए कोई अंतर्निहित टूल है या कोई मुझे एक sedकोड प्रदान कर सकता है जो यह करेगा?

मैंने इंटरनेट और इंटरनेट पर unix.stackexchange.com के माध्यम से थोड़ी खोज की लेकिन मुझे यूरोड एनकोडिंग को डिकोड करने के लिए कोई कमांड लाइन टूल नहीं मिला।

मैं बस एक txtफाइल को संपादित करना चाहता हूं, ताकि:

  • %21 हो जाता है !
  • %23 हो जाता है #
  • %24 हो जाता है $
  • %26 हो जाता है &
  • %27 हो जाता है '
  • %28 हो जाता है (
  • %29 हो जाता है )

और इसी तरह।


जवाबों:


107

इन पायथन को एक लाइनर मिला जो आप चाहते हैं:

$ 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 - मेरे लिए एक नए क्यू की तरह लगता है। मैं यह पूछना चाहता हूँ, और यह एक संदर्भ।
स्लम

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
ध्यान दें, कि यह एक पायथन 2 है; उन प्रणालियों पर जहां pythonडिफ़ॉल्ट रूप से 3 है, यह त्रुटि होगी। मदद pythonकरने के लिए बदल रहा है python2
इवान कोलेमिचेक

4
के लिए python3आप के import urllib.parse as ulबजाय का उपयोग कर सकते हैं import urllib as ul
.बोट्टी

61

एसईडी

निम्न कमांड लाइन आज़माएं:

$ 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

नोट: उपरोक्त सिंटैक्स +रिक्त स्थान में परिवर्तित नहीं हो सकता है , और सभी नईलाइनों को खा सकता है।


आप इसे उपनाम के रूप में परिभाषित कर सकते हैं और इसे अपने शेल आरसी फाइलों में जोड़ सकते हैं:

$ 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


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 के सार फ़ाइल , यह भी पर stackoverflow


पीएचपी

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कई लाइन इनपुट के लिए उपयोग करें ।


पर्ल

पर्ल में आप उपयोग कर सकते हैं 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=%..

नोट: पैरामीटर -nGNU के लिए विशिष्ट है awk

देखें: पाठ को urldecode करने के लिए awk printf का उपयोग करना

डिकोडिंग फ़ाइल नाम

यदि आपको फ़ाइल नामों से url एन्कोडिंग हटाने की आवश्यकता है, तो (जैसे ) deurlnameसे टूल का उपयोग करें ।renameutilsdeurlname *.*

यह सभी देखें:


सम्बंधित:


1
awk: जैसा कि यह एक लाइब्रेरी फ़ंक्शन का उपयोग करता है, chr()एक उच्च संभावना है कि यह पूरी तरह से GNU awk ( gawk) पर काम करेगा । हालांकि, इस मामले में POSIX के लिए शायद ही कोई बराबर होगी awk, क्योंकि -nविकल्प (गैर दशमलव तर्क अनुमति) है एक जीएनयू awkविशेषता।
वाक्यविन्यास

आपका पहला sedकोड मुझे xargs: argument line too long≥2164 लाइनों वाली फ़ाइल के लिए देता है ।
स्पार्कहॉक

2
आपके समाधान में printfइस बात का ध्यान नहीं रखा गया है कि url में मौजूद प्रतिशत संकेत जैसे हो सकते हैं %25। आप इन्हें प्रिंटफ़ के लिए किसी अन्य प्रतिशत चिह्न जैसे प्रिंटफ़ के लिए भागने के बिना पास कर देते हैं %%
19

1
बैश संस्करण को local LC_ALL=Cशीर्ष पर रखने की आवश्यकता होती है , अन्यथा सभी विस्तृत वर्ण (जैसे जापानी, चीनी, आदि) बाइट्स में ठीक से टूट नहीं जाते हैं।
फर्नोस्ट


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

पर्ल में आप उपयोग कर सकते हैं 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 कार्यान्वयन के साथ उदाहरण के लिए टेक्स्ट को urldecode करने के लिए awk printf का उपयोग करना देखें ।


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, जो आपको वांछित के रूप में आउटपुट करेगा।


आसानी के लिए, कमांड urlencodeभी सीधे उपलब्ध है gridsite-clientsपैकेज से ( sudo apt-get install gridsite-clientsउबंटू / डेबियन सिस्टम में) स्थापित किया जा सकता है ।

नाम

    urlencode - स्ट्रिंग को URL या एन्कोडेड फ़ॉर्म से परिवर्तित करें
SYNOPSIS

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

विवरण

    urlencode RFC 1738 के अनुसार स्ट्रिंग्स को एन्कोड करता है।

    यही है, वर्ण 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
      पूर्ण रूपांतरण के बजाय, ग्रिडसाइट "माइल्ड URL एन्कोडिंग" करें जिसमें AZ az 0-9 है। = - _ @ और / अनमॉडिफाइड के माध्यम से पारित किया जाता है। इसका परिणाम थोड़ा और अधिक मानव-पठनीय स्ट्रिंग्स है, लेकिन किसी भी स्लैश द्वारा निहित निर्देशिकाओं को बनाने या अनुकरण करने के लिए एप्लिकेशन को तैयार किया जाना चाहिए।
    -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एस्केप अनुक्रम को याद करता है ।
13

@Overv मैंने अभी संशोधित किया है
पंड्या

इसके अलावा, आप यह देखना चाहते हैं कि क्या s/%26/&/gहोता है। (मैंने इसे ठीक किया।)
जी-मैन

9

पर्ल एक लाइनर:

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

उदाहरण:

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

1
यह उत्तर आकर्षक है जब आप पर्ल मॉड्यूल स्थापित करने से निपटना नहीं चाहते हैं।
श्रीधर सरनोबत

1
केवल एक जिसने मैकओएस पर मेरे लिए काम किया।
किक्स


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 (स्लैश एन्कोडिंग)

@ बेवर की टिप्पणी के जवाब में।

यदि आपको स्लैश को एन्कोड करना भी आवश्यक है, तो बस उद्धरण फ़ंक्शन में एक खाली दूसरा तर्क जोड़ें, फिर स्लैश भी एन्कोड किया जाएगा।

तो, आखिरकार बाश में 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

@ बायर: उदाहरण?
DIG ने

Urlencode "Проба пера" -> परिणाम में एक स्लैश जोड़ें: परिणाम: स्लैश एन्कोडेड नहीं है।
Bevor

1
@ बायर: आप सही कह रहे हैं। आपकी टिप्पणी के लिये धन्यवाद। इसमें आपकी टिप्पणी को दर्शाने के लिए मैं अपना उत्तर भी बदलूंगा।
DIG mbl

4

और एक और पर्ल दृष्टिकोण:

#!/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

एक उत्तर (ज्यादातर पोज़िक्स) शेल में:

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

स्पष्टीकरण:

  • -e 's/+/ /g+अंतरिक्ष में प्रत्येक को रूपांतरित करता है (जैसा कि url-encode मानदंड में वर्णित है)
  • -e 's/%\(..\)/\\\\x\1/g'प्रत्येक को बदलने %XXमें \\xXX\नियमों को उद्धृत करके किसी एक को हटा दिया जाएगा।
  • इनर प्रिंटफ़ बस वहाँ है इनपुट सेड को पास करने के लिए। हम इसे किसी अन्य तंत्र द्वारा प्रतिस्थापित कर सकते हैं
  • बाहरी प्रिंटफ \\xXXअनुक्रम और व्याख्या परिणाम की व्याख्या करता है ।

संपादित करें:

चूंकि %URL में हमेशा व्याख्या की जानी चाहिए, इसलिए इस उत्तर को सरल बनाना संभव है। ऐड में, मुझे लगता है कि इसका इस्तेमाल करने के क्लीनर है xargsके बजाय backquotes (धन्यवाद @josch के लिए)।

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

दुर्भाग्य से, (जैसा कि @josch ने देखा) इनमें से कोई भी समाधान Posix के अनुरूप नहीं है क्योंकि \xएस्केप अनुक्रम को Posix में परिभाषित नहीं किया गया है।


U & L में आपका स्वागत है। शायद आप इस उत्तर को समझा सकते हैं और यह कैसे काम करता है। हम आम तौर पर हमारे जवाबों को विवरणों के साथ लंबे रूप में पसंद करते हैं, न कि केवल कोड स्निपेट के रूप में।
स्लम

मुझे वास्तव में यह उत्तर पसंद है क्योंकि यह व्यापक, पोर्टेबल है और इसके लिए पर्ल या अजगर जैसे अतिरिक्त भारी बाहरी कार्यक्रमों की आवश्यकता नहीं है। मेरे लिए अच्छा काम करता है।
स्टीव विल्स

1
महान समाधान। और भी छोटा और होशियार ... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g':। -eविकल्प वास्तव में यहाँ छोड़ा जा सकता है ...
सिंटैक्स त्रुटि

1
@josch आप सही हैं, printfएक अंतर्निहित है dashऔर यह \xभागने की पहचान नहीं करता है । आप इसे काम करने के लिए /usr/bin/printfइसके बजाय उपयोग कर सकते हैं printf। आम तौर पर, आपको उपयोग करने में सक्षम होना चाहिए command printf, लेकिन ऐसा लगता है कि यह काम नहीं करना चाहिए। यह बिल्ट-इन का उपयोग जारी रखता है।
11:33 पर Jérôme Pouiller

1
@ \xभागने का समर्थन वास्तव में POSIX का हिस्सा नहीं है: pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html मेरे परीक्षणों के दौरान मैंने एक और समस्या देखी। आप अपने ..रेगेक्स को बदलना चाह सकते हैं [a-zA-Z0-9][a-zA-Z0-9]क्योंकि अन्यथा '%%%' जैसे इनपुट विफल हो जाएंगे। मैंने s/%/%%/gप्रिंट के लिए प्रतिशत से बचने के लिए सुनिश्चित करने के लिए अंत में भी जोड़ा ।
जॉच

1

शैल-केवल:

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

विकल्प के रूप में व्यवहार किए जाने से डैश के साथ शुरू होने वाले तर्कों को जोड़ना --या %bरोकना।

Zsh में अंत में ${x//%/a}जोड़ता aहै लेकिन के साथ ${x//\%/a}बदल देता %है a


1

यहाँ एक और स्क्रिप्ट से प्रासंगिक बिट्स हैं (जो कि मैंने अभी हाल ही में लिखी गई एक अन्य उत्तर से अपनी youtube.com डाउनलोड स्क्रिप्ट से बेशर्मी से चुरा लिया है ) । यह उपयोग करता है sedऔर शेल एक काम कर रहे urld timecode बनाने के लिए।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.