কমান্ড লাইনে আমি কীভাবে শতাংশ-এনকোডযুক্ত স্ট্রিংগুলি এনকোড এবং ডিকোড করতে পারি?


31

কমান্ড লাইনে আমি কীভাবে শতাংশ-এনকোডেড (ইউআরএল এনকোডড) স্ট্রিংগুলি এনকোড এবং ডিকোড করতে পারি ?

আমি এমন একটি সমাধান খুঁজছি যা এটি করতে পারে:

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

আপনি কি বিভিন্ন এনকোডিংগুলিও যুক্ত করতে চান? %E6ndr%FCkআমার কাছে (স্ট্যান্ডার্ড) ইউটিএফ 8 এর মতো দেখাচ্ছে না। নাকি এটি একটি উদাহরণ?
ব্যবস্থা করুন

@ অ্যারেঞ্জ তা ধরার জন্য ধন্যবাদ স্পষ্টতই আমি অনলাইন রূপান্তরকারীদের অনুসন্ধান ফলাফলগুলির মধ্যে খারাপ আপেল বেছে নিয়েছি ।
ü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
প্রথম লাইনের শেষে সেই চরিত্রটি কী? সম্পাদনা করুন: নিজের উত্তর দিয়েছি - পেয়েছে, উদাহরণস্বরূপ এটি কেবলমাত্র একক অক্ষর ইউটিএফ 8-থেকে-এনকোডেড স্ট্রিং :-)
টিএমজি

1
কীভাবে পাইথন 3?
রিচার্ডো

@ রিকার্ডোই এই উত্তরটি পরীক্ষা করুন ।
পাবলো এ

27

খোল

নিম্নলিখিত কমান্ড লাইন চেষ্টা করুন:

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

আপনি এটির নাম হিসাবে সংজ্ঞা দিতে পারেন এবং এটি আপনার শেল আরসি ফাইলগুলিতে যুক্ত করতে পারেন :

$ 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 () ধরে নিয়েছে যে ডেটাতে কোনও ব্যাকস্ল্যাশ নেই।


বাশ + এক্সএক্সডি

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


পাইথন

নিম্নলিখিত উপকরণগুলি সংজ্ঞায়িত করার চেষ্টা করুন:

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

সূত্র: রাস্লানস্পিবক


পিএইচপি

পিএইচপি ব্যবহার করে আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

$ 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

sed

ব্যবহার করে sedঅর্জন করা যায়:

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

awk

আনন সমাধান চেষ্টা করুন :

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

দেখুন: পাঠ্যকে urldecode করতে awk প্রিন্টফ ব্যবহার করা


ফাইলের নাম ডিকোডিং

আপনার যদি ফাইলের নামগুলি থেকে url এনকোডিং অপসারণ করতে deurlnameহয় তবে renameutils(যেমন উদাহরণস্বরূপ) থেকে সরঞ্জামটি ব্যবহার করুনdeurlname *.* ) ।

আরো দেখুন:


সম্পর্কিত:


ব্যাশ + + xxd যাও সংস্করণ স্ট্রিং যে একটি ধারণ সাথে কাজ করে না %, আপনি হয়ত প্রতিস্থাপন করতে পারে printf "$c"সঙ্গে printf "%c" "$c"? অন্য একটি সমস্যাটি হ'ল কিছু অ্যাস্কিআই চর্যাচটারগুলি äকিছু ভাষা সেটিংসে এনকোড করা হয়নি (যেমন ) export LC_ALL=Cফাংশনে কোনও অ্যাড যোগ করতে পারে (যা ফাংশনের বাইরে কিছু প্রভাবিত করতে পারে না)?
12431234123412341234123

8

শতাংশ-এনকোড সংরক্ষিত ইউআরআই অক্ষর এবং নন-এএসসিআইআই অক্ষর

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 -pপ্রতি 60 টি অক্ষরের পরে যুক্ত করা লাইনফিডগুলি সরিয়ে দেয় ।

বাশের এএসসিআইআই বর্ণমালা অক্ষর ব্যতীত সমস্ত অক্ষর শতাংশ-এনকোড করুন

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 ''লাইনফিড এবং নাল বাইটগুলি এড়িয়ে চলত। এটি ছাড়া IFS=অক্ষরের IFSসাথে প্রতিস্থাপন করবে %00। ছাড়া LC_ALL=Cএই উদাহরণস্বরূপ প্রতিস্থাপন করবে সঙ্গে %3042একটি হল UTF-8 লোকেলে।


5

শুধুমাত্র ডিকোডিংয়ের জন্য বিশুদ্ধ বাশ সমাধান :

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

4

আমি এই থ্রেডে সেরা উত্তরের বিষয়ে মন্তব্য করতে পারি না , সুতরাং এটি আমার।

ব্যক্তিগতভাবে, আমি ইউআরএল এনকোডিং এবং ডিকোডিংয়ের জন্য এই উপকরণগুলি ব্যবহার করি:

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 ম আর্গ)

... @ মুরু মন্তব্য অনুসারে।

আপডেট 2017-05-28 (স্ল্যাশ এনকোডিং)

আপনার যদি স্ল্যাশকে এনকোড করা দরকার হয় তবে কেবল উদ্ধৃতি ফাংশনে একটি খালি দ্বিতীয় যুক্তি যুক্ত করুন, তারপরে স্ল্যাশটিও এনকোড হবে।

সুতরাং, পরিশেষে 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]আরও উপযুক্ত হতে পারে। বিশেষত যদি আপনি এটি স্ক্রিপ্টগুলিতে ব্যবহার করেন এবং দুর্ঘটনাক্রমে একটি খালি প্রথম যুক্তি দেন।
মুড়ু

@ মুরু মন্তব্য অনুসারে আমি কমান্ড লাইনে একটি যুক্তির জন্য চেকিং পরিবর্তন করেছি। এটি ছিল: 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] এটি, যদি এমনকি কোনও খালি প্রথম যুক্তি থাকে তবে কমান্ডটি স্ট্যান্ডার্ড ইনপুট থেকে ইনপুটটির জন্য অপেক্ষা করে না, তবে একটি খালি যুক্তি প্রক্রিয়াকরণ করে।
ডিআইজি এমবিএল

2

আমি একটি প্যাকেজ পেয়েছি renameutils, এতে এমন ইউটিলিটি রয়েছে deurlnameযা "শতাংশ-এনকোডড" অক্ষরযুক্ত ফাইলটির নাম পরিবর্তন করতে সক্ষম।

দুর্ভাগ্যক্রমে, এটি স্টিডিন বা কমান্ড লাইন বিকল্পটি ডিকোড করে না, কেবল একটি ফাইলের নাম পরিবর্তন করে, তাই ডিকোডিং (পুনরায় নামকরণ করা ফাইলের নাম) পেতে আপনাকে একটি ডামি ফাইল তৈরি করতে হবে, তবে কিছু বাশ স্ক্রিপ্টিংয়ের মাধ্যমে প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে পরিচালিত হতে পারে ।

এনকোডিং অংশটি সম্পর্কে কোনও তথ্য নয়, এমনকি কোন অক্ষরটি এনকোড করা উচিত তা প্রশ্নযুক্ত হতে পারে বলেও। শুধু নন-এএসসিআইআই?

আমি মনে করি আরও ভাল কিছু সরঞ্জাম / পদ্ধতি থাকা উচিত।


1

অনুরূপ স্টেফানো ansqer কিন্তু পাইথন 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

এনকোডিংয়ের জন্য এখানে একটি পসিক্স আওক ফাংশন রয়েছে:

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.