কার্ল কমান্ডের জন্য কীভাবে ইউল্যানকোড ডেটা করবেন?


319

আমি পরীক্ষার জন্য বাশ স্ক্রিপ্ট লেখার চেষ্টা করছি যা একটি প্যারামিটার নেয় এবং এটি কার্লের মাধ্যমে ওয়েব সাইটে প্রেরণ করে। বিশেষ অক্ষরগুলি সঠিকভাবে প্রক্রিয়া করা হচ্ছে তা নিশ্চিত করার জন্য আমাকে মানটি এনকোড দেওয়া দরকার। এই কাজ করতে সবচেয়ে ভালো উপায় কি?

এখানে এখন পর্যন্ত আমার বেসিক লিপিটি এখানে রয়েছে:

#!/bin/bash
host=${1:?'bad host'}
value=$2
shift
shift
curl -v -d "param=${value}" http://${host}/somepath $@


উত্তর:


394

ব্যবহার curl --data-urlencode; থেকে man curl:

এটি --dataইউআরএল-এনকোডিং সম্পাদন করে এমন ব্যতিক্রম সহ অন্যান্য বিকল্পের মতো এই ডেটা পোস্ট করে । সিজিআই-কমপ্লায়েন্ট হওয়ার জন্য, <data>অংশটি একটি নাম এবং তার পরে পৃথককারী এবং একটি সামগ্রীর স্পেসিফিকেশন দিয়ে শুরু করা উচিত।

ব্যবহারের উদাহরণ:

curl \
    --data-urlencode "paramName=value" \
    --data-urlencode "secondParam=value" \
    http://example.com

দেখুন man পৃষ্ঠা আরও তথ্যের জন্য।

এর জন্য কার্ল 7.18.0 বা আরও নতুন (জানুয়ারী 2008 এ প্রকাশিত) প্রয়োজন । আপনার curl -Vকোন সংস্করণ রয়েছে তা যাচাই করতে ব্যবহার করুন ।

আপনি কোয়েরি স্ট্রিংটি পাশাপাশি এনকোড করতে পারেন :

curl -G \
    --data-urlencode "p1=value 1" \
    --data-urlencode "p2=value 2" \
    http://example.com
    # http://example.com?p1=value%201&p2=value%202

5
কেবলমাত্র পোষ্ট পোস্টের জন্যই কাজ বলে মনে হচ্ছে। ডকুমেন্টেশন এখানে: curl.haxx.se/docs/manpage.html#--data-urlencode
স্ট্যান জেমস

82
@ স্ট্যানজেমস আপনি যদি এটির মতো ব্যবহার করেন তবে কার্ল একটি জিইটি অনুরোধের জন্য এনকোডিংও করতে পারে। curl -G --data-urlencode "blah=df ssdf sdf" --data-urlencode "blah2=dfsdf sdfsd " http://whatever.com/whatever
kberg

13
@kberg আসলে, এটি কেবল ক্যোয়ারী ডেটার জন্য কাজ করবে। কার্ল একটি 'যোগ করবে?' ইউলিংকড প্যারামগুলি অনুসরণ করে। আপনি কিছু url পোস্টফিক্স urlncode করতে চান (যেমন কিছু নথি আইডির জন্য একটি কাউচডিবি জিইটি), তবে '--ডাটা-ইউরেলকোড' কাজ করবে না।
বোকেহ

1
জন্য কাজ করে না curl --data-urlencode "description=![image]($url)" www.example.com। কোন ধারণা কেন? `
খুরশিদ আলম

1
@NadavB পলায়নের "
BlackJack

179

খাঁটি BASH উত্তর এখানে।

rawurlencode() {
  local string="${1}"
  local strlen=${#string}
  local encoded=""
  local pos c o

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     case "$c" in
        [-_.~a-zA-Z0-9] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done
  echo "${encoded}"    # You can either set a return variable (FASTER) 
  REPLY="${encoded}"   #+or echo the result (EASIER)... or both... :p
}

আপনি এটি দুটি উপায়ে ব্যবহার করতে পারেন:

easier:  echo http://url/q?=$( rawurlencode "$args" )
faster:  rawurlencode "$args"; echo http://url/q?${REPLY}

[সম্পাদিত]

এখানে মেলানো কাঁচাবার্ডিকোড () ফাংশনটি রয়েছে - যা - সমস্ত বিনয়ের সাথে - দুর্দান্ত।

# Returns a string in which the sequences with percent (%) signs followed by
# two hex digits have been replaced with literal characters.
rawurldecode() {

  # This is perhaps a risky gambit, but since all escape characters must be
  # encoded, we can replace %NN with \xNN and pass the lot to printf -b, which
  # will decode hex for us

  printf -v REPLY '%b' "${1//%/\\x}" # You can either set a return variable (FASTER)

  echo "${REPLY}"  #+or echo the result (EASIER)... or both... :p
}

মিলের সেট সহ, আমরা এখন কয়েকটি সাধারণ পরীক্ষা করতে পারি:

$ diff rawurlencode.inc.sh \
        <( rawurldecode "$( rawurlencode "$( cat rawurlencode.inc.sh )" )" ) \
        && echo Matched

Output: Matched

এবং যদি আপনি সত্যিই অনুভব করেন যে আপনার একটি বাহ্যিক সরঞ্জাম প্রয়োজন (ভাল, এটি অনেক দ্রুত চলে যাবে, এবং বাইনারি ফাইলগুলি এবং এই জাতীয় ...

replace_value=$(echo $replace_value | sed -f /usr/lib/ddns/url_escape.sed)

যেখানে url_escape.sed ছিল এমন একটি ফাইল যা এই বিধিগুলি ধারণ করে:

# sed url escaping
s:%:%25:g
s: :%20:g
s:<:%3C:g
s:>:%3E:g
s:#:%23:g
s:{:%7B:g
s:}:%7D:g
s:|:%7C:g
s:\\:%5C:g
s:\^:%5E:g
s:~:%7E:g
s:\[:%5B:g
s:\]:%5D:g
s:`:%60:g
s:;:%3B:g
s:/:%2F:g
s:?:%3F:g
s^:^%3A^g
s:@:%40:g
s:=:%3D:g
s:&:%26:g
s:\$:%24:g
s:\!:%21:g
s:\*:%2A:g

4
দুর্ভাগ্যক্রমে, এই স্ক্রিপ্টটি কিছু অক্ষরে যেমন ব্যর্থ হয়েছে, যেমন 'é' এবং '½', আউটপুটিং 'ই% এফএফএফএফএফএফএফএফএফএফএফএফএফএফএফএফএফএফএফসিএফসি' এবং যথাক্রমে (প্রতি-চরিত্রের লুপের বি / সি), আমি বিশ্বাস করি।
ম্যাথমেট্যাটিকস

1
এটি আমার জন্য বাশ ৪.৩.১১ (1) এ কাজ করতে ব্যর্থ। স্ট্রিংটি Jogging «à l'Hèze»উত্পন্ন করে Jogging%20%abà%20l%27Hèze%bbযা decodeURIComponent
জেএসকে

2
কোডের সেই প্রথম ব্লকে প্রিন্টফের শেষ প্যারামিটারটির অর্থ কী? তা হচ্ছে, এটি কেন ডাবল-কোট, একক-উদ্ধৃতি, ডলার-সাইন, লেটার-সি, ডাবল-কোট? একক-উক্তি কি করে?
কলিন ফ্রেইজার

1
@ ডিএমকন্টোর - এটি কেবল একটি নম্র বাশ স্ক্রিপ্ট, এটির বহু-বাইট অক্ষর বা ইউনিকোডের কোনও ধারণা নেই। এটি যখন ń ( \u0144) এর মতো একটি অক্ষর দেখায় এটি নির্লজ্জভাবে % 144 আউটপুট দেয়, ╡ ( \u2561) আউটপুট% 2561 হিসাবে প্রদর্শিত হবে। এগুলির জন্য সঠিক কাঁচা-লিংকযুক্ত উত্তরগুলি যথাক্রমে % C5% 84% 0A এবং% E2% 95% A1 হবে।
অরওলোফিল

1
@ কলিনফ্রেজার একক উদ্ধৃতি নিম্নলিখিত বর্ণনাকে তার সংখ্যাসূচক মানে রূপান্তর করতে পরিবেশন করে। সুত্র। pubs.opengroup.org/onlinepubs/9699919799/utilities/…
স্যাম

94

আপনার বাশ স্ক্রিপ্টের দ্বিতীয় লাইনে পার্লের URI::Escapeমডিউল এবং uri_escapeফাংশনটি ব্যবহার করুন :

...

value="$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$2")"
...

সম্পাদনা করুন: মন্তব্যগুলিতে ক্রিস জনসেনের পরামর্শ অনুসারে উদ্ধৃত সমস্যাগুলির সমাধান করুন । ধন্যবাদ!


2
ইউআরআই :: এস্কেপ ইনস্টল করা নাও হতে পারে, সে ক্ষেত্রে আমার উত্তরটি পরীক্ষা করুন।
নীল রঙের

আমি এটি (ব্যবহার echo, পাইপ এবং <>) স্থির করেছি এবং এখন it 2 এ অ্যাডোস্ট্রোফ বা ডাবল-কোটস থাকা সত্ত্বেও এটি কাজ করে। ধন্যবাদ!
দুবেক

9
echoআপনিও value="$(perl -MURI::Escape -e 'print uri_escape($ARGV[0]);' "$2")"
এটিকে

1
ক্রিস জনসনের সংস্করণটি আরও ভাল। আমার আমার পরীক্ষার এক্সপ্রেশনটিতে {{সত্য had ছিল এবং ইকো দিয়ে ইউরি_স্কেপ / পার্ল ভেরিয়েবল এক্সপেনশনের মাধ্যমে এটি ব্যবহার করে।
mm2001

1
@ jrw32982 হ্যাঁ, এটির দিকে ফিরে তাকাতে, এই ভাষাটি সম্পাদন করার জন্য আরও একটি ভাষা থাকা ভাল। যদি পারতাম, আমি আমার downvote ফেরত নিতে অনুভব করি, কিন্তু হায় এটি বর্তমানে লক করা আছে।
thecoshman

69

আরেকটি বিকল্প হ'ল jq(ফিল্টার হিসাবে):

jq -sRr @uri

-R( --raw-input) ইনপুট লাইনগুলিকে JSON হিসাবে পার্স করার পরিবর্তে স্ট্রিং হিসাবে বিবেচনা করে এবং -sR( --slurp --raw-input) ইনপুটটি একটি স্ট্রিংয়ে পড়ে। -r( --raw-output) JSON স্ট্রিং লিটারেলের পরিবর্তে স্ট্রিংয়ের সামগ্রীগুলি আউটপুট করে।

যদি ইনপুটটি অন্য কমান্ডের আউটপুট না হয় তবে আপনি এটি jqস্ট্রিং ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন :

jq -nr --arg v "my shell string" '$v|@uri'

-n( --null-input) ইনপুট পড়ে না এবং স্ট্রিং হিসাবে ভেরিয়েবল --arg name valueসঞ্চয় valueকরে name। ফিল্টার সালে $nameপরিবর্তনশীল (একক উদ্ধৃতির মধ্যে, শেল দ্বারা সম্প্রসারণ এড়াতে), রেফারেন্স name

বাশ ফাংশন হিসাবে আবৃত, এটি হয়ে যায়:

function uriencode { jq -nr --arg v "$1" '$v|@uri'; }

বা এই শতাংশ-এনকোড সমস্ত বাইট:

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

3
<3 এটি ... শীর্ষস্থানীয় এবং স্বীকৃত আইএমও হওয়া উচিত (হ্যাঁ যদি আপনি curlকাজ করে এমন এনকোড করতে বলতে পারেন এবং যদি বাশের একটি বিল্টিন রয়েছে যা গ্রহণযোগ্য হবে - তবে jqআমি সঠিক ফিট হিসাবে মনে হচ্ছে আমি আরামের স্তরটি অর্জন করা থেকে অনেক দূরে) এই সরঞ্জামটি)

5
আমার মতো একই জিনিসটির জন্য যে কেউ ভাবছেন: @uriএটি কিছু পরিবর্তনশীল নয়, তবে স্ট্রিম্যাটিং স্ট্রিং এবং পলায়নের জন্য একটি আক্ষরিক জেকিউ ফিল্টার ব্যবহৃত হয়; দেখতে jq ম্যানুয়াল বিস্তারিত জানার জন্য (দুঃখিত, কোন সরাসরি লিঙ্ক, অনুসন্ধান করার প্রয়োজনীয়তা @uriপৃষ্ঠাতে ...)
এসএসসি

এক্সএক্সডি সংস্করণটি কেবলমাত্র ধরণের জিনিস যা আমি খুঁজছিলাম is এমনকি এটি কিছুটা নোংরা
রায়ান স্যান্ডারসন

1
ইউআরএল-এনকোডে জেকি-র একটি নমুনা ব্যবহার:printf "http://localhost:8082/" | jq -sRr '@uri'
আশুতোষ জিন্দাল

67

সম্পূর্ণতার জন্য, অনেকগুলি সমাধান একটি বিশেষ অক্ষর ব্যবহার করে sedবা awkকেবল অনুবাদ করে এবং কোড আকারের দ্বারা এটি বেশ বড় হয় এবং এনকোড হওয়া উচিত এমন অন্যান্য বিশেষ অক্ষরকে অনুবাদও করে না।

ইউলিনকোডের নিরাপদ উপায় হ'ল কেবলমাত্র প্রতিটি একক বাইটকে এনকোড করা - এমনকি তাদের অনুমতি দেওয়া হত।

echo -ne 'some random\nbytes' | xxd -plain | tr -d '\n' | sed 's/\(..\)/%\1/g'

এক্সএক্সডি এখানে যত্ন নিচ্ছে যে ইনপুটটি বাইট হিসাবে পরিচালনা করা হয় অক্ষর হিসাবে নয়।

সম্পাদনা:

এক্সএক্সডি ডেবিয়ায় ভিআইএম-সাধারণ প্যাকেজ নিয়ে আসে এবং আমি ঠিক এমন একটি সিস্টেমে ছিলাম যেখানে এটি ইনস্টল করা হয়নি এবং আমি এটি ইনস্টল করতে চাইনি। আলোরনেটেটিভ হ'ল দেবিয়ানের hexdumpবিএসডিমেইনটিলস প্যাকেজটি ব্যবহার করা। নিম্নলিখিত গ্রাফ অনুযায়ী, bsdmainutils এবং vim-common ইনস্টল করার প্রায় সমান সম্ভাবনা থাকতে হবে:

http://qa.debian.org/popcon-png.php?packages=vim-common%2Cbsdmainutils&show_installed=1&want_legend=1&want_ticks=1

তবে তবুও এখানে এমন একটি সংস্করণ রয়েছে যা এর hexdumpপরিবর্তে ব্যবহার করে xxdএবং trকলটি এড়াতে দেয় :

echo -ne 'some random\nbytes' | hexdump -v -e '/1 "%02x"' | sed 's/\(..\)/%\1/g'

1
xxd -plainএরপরেই হওয়া উচিত tr -d '\n'!
qdii

3
@ কিদিই কেন? এটি কেবলমাত্র নিউলাইনগুলিকে ইউলিনকোড করা অসম্ভব করে তুলবে না তবে এটি xxd দ্বারা নির্মিত নিউলাইনগুলি আউটপুটটিতে ভুলভাবে সন্নিবেশ করবে।
জোশ

1
@josch। এটি কেবল সাধারণ ভুল। প্রথমত, যে কোনও \nঅক্ষর দ্বারা অনুবাদ করা xxd -plainহবে 0a। এটির জন্য আমার শব্দটি গ্রহণ করবেন না, নিজে চেষ্টা করুন: echo -n -e '\n' | xxd -plainএটি প্রমাণ করে যে tr -d '\n'এখানে আপনার অকেজো কারণ দ্বিতীয়টির \nপরে আর কিছু হতে পারে না xxd -plain, চরিত্রের স্ট্রিংয়ের শেষে echo foobarতার নিজস্ব \nচরিত্রটি যুক্ত হয়, তাই প্রত্যাশার xxd -plainসাথে খাওয়া হয় না তবে খাওয়ানো হয় না । তারপরে এটিকে এমন কিছু অক্ষরের স্ট্রিংয়ে অনুবাদ করে যা শেষ হয় , এটি ব্যবহারকারীর জন্য অনুপযুক্ত। আপনি এটি সমাধান করতে যোগ করতে পারেন। foobarfoobar\nxxd -plain0a-necho
qdii

6
@ কাদিই প্রকৃতপক্ষে প্রতিধ্বনির জন্য নিখোঁজ ছিল কিন্তু xxdকলটি কলটির সামনের অংশের tr -d। এটি সেখানে অন্তর্ভুক্ত যাতে কোনও নিউলাইন foobarদ্বারা অনুবাদ করা হয় xxdtr -dপরে xxdকল নতুন লাইন মুছে ফেলার জন্য যে xxd যাও উত্পাদন করে হয়। দেখে মনে হচ্ছে আপনার কোনওদিনই যথেষ্ট পরিমাণে ফুবার থাকে না যাতে এটি xxdনতুন লাইনের জন্ম দেয় তবে দীর্ঘ ইনপুটগুলির জন্য এটি হয়ে যায়। সুতরাং tr -dপ্রয়োজনীয়। আপনার অনুমানের বিপরীতে tr -dইনপুট থেকে নতুন লাইনগুলি সরানো নয় xxdআউটপুট থেকে । আমি ইনপুটটিতে নিউলাইনগুলি রাখতে চাই। আপনার একমাত্র বৈধ পয়েন্টটি, এটি প্রতিধ্বনি একটি অপ্রয়োজনীয় নিউলাইন যুক্ত করে adds
josch

1
@ কাদিই এবং কোনও অপরাধ নেওয়া হয়নি - আমি কেবল মনে করি আপনি ভুল বলে মনে করেন, echo -nআমি যা হারিয়েছিলাম তা
বাদ দিয়ে

62

রূপগুলির মধ্যে একটি, কুরুচিপূর্ণ, তবে সহজ হতে পারে:

urlencode() {
    local data
    if [[ $# != 1 ]]; then
        echo "Usage: $0 string-to-urlencode"
        return 1
    fi
    data="$(curl -s -o /dev/null -w %{url_effective} --get --data-urlencode "$1" "")"
    if [[ $? != 3 ]]; then
        echo "Unexpected error" 1>&2
        return 2
    fi
    echo "${data##/?}"
    return 0
}

এখানে উদাহরণস্বরূপ ওয়ান-লাইনার সংস্করণটি দেওয়া হয়েছে ( ব্রুনোর পরামর্শ অনুসারে ):

date | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" | cut -c 3-

# If you experience the trailing %0A, use
date | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" | sed -E 's/..(.*).../\1/'

1
আমি মনে করি এটি সিআরএল এর ইউআরএল এনকোডিং পুনরায় ব্যবহার করার খুব চালাক উপায়।
solidsnack

13
এটি একেবারে উজ্জ্বল! আমি সত্যিই চাই আপনি এটিকে একটি লাইন ছেড়ে রেখেছিলেন যাতে লোকেরা দেখতে পারে যে এটি কতটা সহজ। URL টি dateকমান্ডের ফলাফল এনকোড করার জন্য ... date | curl -Gso /dev/null -w %{url_effective} --data-urlencode @- "" | cut -c 3-( cutআপনার প্রথম ২ টি অক্ষর বন্ধ করতে হবে, কারণ কার্লের আউটপুট প্রযুক্তিগতভাবে ক্যোয়ারী স্ট্রিংয়ের সাথে সম্পর্কিত একটি ইউআরএল))
ব্রুনো ব্রোনোস্কি

2
@ ব্রুনো ব্রোনোস্কি আপনার ওয়ান-লাইনার বৈকল্পিক ভাল তবে মনে হচ্ছে এনকোডিংয়ের শেষে একটি "% 0A" যুক্ত হয়েছে। ব্যবহারকারীদের সাবধান। ফাংশন সংস্করণে এই সমস্যাটি মনে হচ্ছে না।
লেভিগ্রোকার

7
%0Aশেষে এড়াতে , printfপরিবর্তে ব্যবহার করুন echo
কেনারব

2
এক লাইনারটি দুর্দান্ত
স্টিফেন ব্লাম

49

পাইথনে আমি এটি আরও পাঠযোগ্য বলে মনে করি:

encoded_value=$(python -c "import urllib; print urllib.quote('''$value''')")

ট্রিপল 'নিশ্চিত করে যে মানের একক উক্তিগুলি ক্ষতিগ্রস্থ হবে না। urllib স্ট্যান্ডার্ড লাইব্রেরিতে রয়েছে। এটি এই উন্মাদ (বাস্তব বিশ্বের) url এর জন্য পরীক্ষার জন্য কাজ করে:

"http://www.rai.it/dl/audio/" "1264165523944Ho servito il re d'Inghilterra - Puntata 7

2
ট্রিপলকোটিংয়ের সাথে আমার উদ্ধৃতি এবং বিশেষ অক্ষরগুলির সাথে কিছুটা সমস্যা ছিল, এটি মূলত সমস্ত কিছুর জন্য কাজ করবে বলে মনে হয়েছিল: এনকোডড_ভ্যালু = "$ (ইকো-এন" $ {ডেটা} "| পাইথন-সি" আমদানি ইউরিলিব; আমদানি সিস; সিএস.স্টডআউট)। লিখুন (urllib.quote (sys.stdin.read ())) ")";
মনিকা সেলিওর নিন্দা বন্ধ করুন

পাইথন 3 সংস্করণ হবে encoded_value=$(python3 -c "import urllib.parse; print (urllib.parse.quote('''$value'''))")
ক্রিশাল

1
python -c 'import urllib, sys; sys.stdout.writelines(urllib.quote_plus(l, safe="/\n") for l in sys.stdin)'প্রায় কোনও উদ্ধৃতি সমস্যা নেই, এবং স্মৃতিশক্তি / গতির দক্ষ হওয়া উচিত (স্কুইটিংয়ের জন্য পরীক্ষা করা হয়নি, সংরক্ষণ করা উচিত)
অ্যালোস মাহডাল

2
পরে কোড হিসাবে পার্স করা স্ট্রিংয়ের sys.argvপরিবর্তে উল্লেখ করা আরও নিরাপদ হবে $value। কি হবে যদি valueঅন্তর্ভুক্ত ''' + __import__("os").system("rm -rf ~") + '''?
চার্লস ডাফি

2
python -c "import urllib;print urllib.quote(raw_input())" <<< "$data"
রকাল্লাইট

30

আমি নিম্নলিখিত স্নিপেটটি প্রোগ্রাম কলগুলির একটি শৃঙ্খলে আটকে রাখতে দরকারী বলে মনে করেছি, যেখানে ইউআরআই :: এস্কেপ ইনস্টল করা নাও হতে পারে:

perl -p -e 's/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg'

( উত্স )


4
আমার জন্য কাজ। আমি এটাকে পার্ল-পাল্পে বদলে দিয়েছি ... (চিঠিটি) এটি আমার উদ্দেশ্যগুলির জন্য আমার পূর্ববর্তী নিউলাইনটি সরিয়ে ফেলল।
জনিলম্বদা

2
এফওয়াইআই, এর বিপরীতমুখী কাজটি করতে, ব্যবহার করুন perl -pe 's/\%(\w\w)/chr hex $1/ge'(উত্স: unix.stackexchange.com/questions/159253/… )
শ্রীধর সারনোবাত

2
আপনাকে কোন অক্ষরগুলি এনকোড করতে হবে তা নির্ভর করে আপনি এটিকে সহজ করতে পারেন perl -pe 's/(\W)/sprintf("%%%02X", ord($1))/ge' পারবেন যা অক্ষর, সংখ্যা এবং আন্ডারস্কোরগুলিকে অনুমতি দেয় তবে অন্য সমস্ত কিছুকে এনকোড করে।
রব্রু

23

আপনি যদি GETঅনুরোধ চালাতে এবং খাঁটি কার্ল ব্যবহার করতে চান তবে --get@ জ্যাকব এর সমাধানটিতে যোগ করুন ।

এখানে একটি উদাহরণ:

curl -v --get --data-urlencode "access_token=$(cat .fb_access_token)" https://graph.facebook.com/me/feed

15

ডাব্লু সংস্করণে সরাসরি লিঙ্ক: http://www.shelldorado.com/scriptts/cmds/urlencode
আমি কয়েক বছর ধরে এটি ব্যবহার করেছি এবং এটি একটি কবজির মতো কাজ করে

:
##########################################################################
# Title      :  urlencode - encode URL data
# Author     :  Heiner Steven (heiner.steven@odn.de)
# Date       :  2000-03-15
# Requires   :  awk
# Categories :  File Conversion, WWW, CGI
# SCCS-Id.   :  @(#) urlencode  1.4 06/10/29
##########################################################################
# Description
#   Encode data according to
#       RFC 1738: "Uniform Resource Locators (URL)" and
#       RFC 1866: "Hypertext Markup Language - 2.0" (HTML)
#
#   This encoding is used i.e. for the MIME type
#   "application/x-www-form-urlencoded"
#
# Notes
#    o  The default behaviour is not to encode the line endings. This
#   may not be what was intended, because the result will be
#   multiple lines of output (which cannot be used in an URL or a
#   HTTP "POST" request). If the desired output should be one
#   line, use the "-l" option.
#
#    o  The "-l" option assumes, that the end-of-line is denoted by
#   the character LF (ASCII 10). This is not true for Windows or
#   Mac systems, where the end of a line is denoted by the two
#   characters CR LF (ASCII 13 10).
#   We use this for symmetry; data processed in the following way:
#       cat | urlencode -l | urldecode -l
#   should (and will) result in the original data
#
#    o  Large lines (or binary files) will break many AWK
#       implementations. If you get the message
#       awk: record `...' too long
#        record number xxx
#   consider using GNU AWK (gawk).
#
#    o  urlencode will always terminate it's output with an EOL
#       character
#
# Thanks to Stefan Brozinski for pointing out a bug related to non-standard
# locales.
#
# See also
#   urldecode
##########################################################################

PN=`basename "$0"`          # Program name
VER='1.4'

: ${AWK=awk}

Usage () {
    echo >&2 "$PN - encode URL data, $VER
usage: $PN [-l] [file ...]
    -l:  encode line endings (result will be one line of output)

The default is to encode each input line on its own."
    exit 1
}

Msg () {
    for MsgLine
    do echo "$PN: $MsgLine" >&2
    done
}

Fatal () { Msg "$@"; exit 1; }

set -- `getopt hl "$@" 2>/dev/null` || Usage
[ $# -lt 1 ] && Usage           # "getopt" detected an error

EncodeEOL=no
while [ $# -gt 0 ]
do
    case "$1" in
        -l) EncodeEOL=yes;;
    --) shift; break;;
    -h) Usage;;
    -*) Usage;;
    *)  break;;         # First file name
    esac
    shift
done

LANG=C  export LANG
$AWK '
    BEGIN {
    # We assume an awk implementation that is just plain dumb.
    # We will convert an character to its ASCII value with the
    # table ord[], and produce two-digit hexadecimal output
    # without the printf("%02X") feature.

    EOL = "%0A"     # "end of line" string (encoded)
    split ("1 2 3 4 5 6 7 8 9 A B C D E F", hextab, " ")
    hextab [0] = 0
    for ( i=1; i<=255; ++i ) ord [ sprintf ("%c", i) "" ] = i + 0
    if ("'"$EncodeEOL"'" == "yes") EncodeEOL = 1; else EncodeEOL = 0
    }
    {
    encoded = ""
    for ( i=1; i<=length ($0); ++i ) {
        c = substr ($0, i, 1)
        if ( c ~ /[a-zA-Z0-9.-]/ ) {
        encoded = encoded c     # safe character
        } else if ( c == " " ) {
        encoded = encoded "+"   # special handling
        } else {
        # unsafe character, encode it as a two-digit hex-number
        lo = ord [c] % 16
        hi = int (ord [c] / 16);
        encoded = encoded "%" hextab [hi] hextab [lo]
        }
    }
    if ( EncodeEOL ) {
        printf ("%s", encoded EOL)
    } else {
        print encoded
    }
    }
    END {
        #if ( EncodeEOL ) print ""
    }
' "$@"

এএসসিআইআই এর পরিবর্তে ইউটিএফ -8 এনকোডিংয়ের জন্য কি কোনও সাধারণ প্রকরণ রয়েছে?
avgvstvs

15

এটি সেরা হতে পারে:

after=$(echo -e "$before" | od -An -tx1 | tr ' ' % | xargs printf "%s")

এটি আমার জন্য দুটি সংযোজন সহ কাজ করে: 1. আর্গুমেন্টের শেষে একটি নতুন লাইন যুক্ত এড়াতে -e এর সাথে প্রতিস্থাপন করুন এবং প্রতিটি জোড়ের সামনে একটি% রাখার জন্য প্রিন্টফ স্ট্রিংয়ে '%%' যুক্ত করুন হেক্স ডিজিট
রব ফাগেন

$ এগিয়ে ব্র্যাকেট যুক্ত করার পরে কাজ করে after=$(echo -e ...
রোমান Rhrn নেস্টারভ

1
এটি কীভাবে কাজ করে তা দয়া করে ব্যাখ্যা করুন। odকমান্ড সাধারণ নয়।
মার্ক স্টসবার্গ

এটি ওএস এক্স এর সাথে কাজ করে না odকারণ এটি জিএনইউ থেকে আলাদা আউটপুট ফর্ম্যাট ব্যবহার করে od। উদাহরণস্বরূপ , ওএস এক্স এর এবং জিএনইউ সহ printf aa|od -An -tx1 -v|tr \ -প্রিন্টগুলি । আপনি ওএস এক্স বা জিএনইউ ব্যবহার করতে পারেন । POSIX তে না হলেও এটি একই জিনিসটি করে । -----------61--61--------------------------------------------------------od-61-61odod -An -tx1 -v|sed 's/ */ /g;s/ *$//'|tr \ %|tr -d \\nododxxd -p|sed 's/../%&/g'|tr -d \\nxxdod
নিসেটামা

2
যদিও এটি কাজ করতে পারে, এটি প্রতিটি একক চরিত্র থেকে পালিয়ে যায়
চার্লি

11

এখানে একটি বাশ সমাধান রয়েছে যা কোনও বাহ্যিক প্রোগ্রামের জন্য আবেদন করে না:

uriencode() {
  s="${1//'%'/%25}"
  s="${s//' '/%20}"
  s="${s//'"'/%22}"
  s="${s//'#'/%23}"
  s="${s//'$'/%24}"
  s="${s//'&'/%26}"
  s="${s//'+'/%2B}"
  s="${s//','/%2C}"
  s="${s//'/'/%2F}"
  s="${s//':'/%3A}"
  s="${s//';'/%3B}"
  s="${s//'='/%3D}"
  s="${s//'?'/%3F}"
  s="${s//'@'/%40}"
  s="${s//'['/%5B}"
  s="${s//']'/%5D}"
  printf %s "$s"
}

4
এটি ব্যাশ সংস্করণগুলির মধ্যে আলাদা আচরণ করে। আরএইচইএল 9.৯-এ ব্যাশটি ৪.১.২ রয়েছে এবং এতে একক উদ্ধৃতি রয়েছে। যদিও ডেবিয়ান 9 এবং ব্যাশ 4.4.12 একক উদ্ধৃতি দিয়ে ঠিক আছে। আমার জন্য একক উদ্ধৃতি অপসারণ এটি উভয় ক্ষেত্রে কাজ করে। s = "$ {s // ',' /% 2C}"
মুনি 764

1
@ Muni764, আপনার অনুসন্ধান প্রতিফলিত করার জন্য আমি উত্তর আপডেট করেছি।
ডেভিডচ্যাম্বারগুলি 21

কেবল একটি সতর্কতা ... এটি চরিত্রের মতো জিনিসগুলিকে এনকোড করবে নাá
ডায়োগভক ২r

10
url=$(echo "$1" | sed -e 's/%/%25/g' -e 's/ /%20/g' -e 's/!/%21/g' -e 's/"/%22/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' -e 's/\*/%2a/g' -e 's/+/%2b/g' -e 's/,/%2c/g' -e 's/-/%2d/g' -e 's/\./%2e/g' -e 's/\//%2f/g' -e 's/:/%3a/g' -e 's/;/%3b/g' -e 's//%3e/g' -e 's/?/%3f/g' -e 's/@/%40/g' -e 's/\[/%5b/g' -e 's/\\/%5c/g' -e 's/\]/%5d/g' -e 's/\^/%5e/g' -e 's/_/%5f/g' -e 's/`/%60/g' -e 's/{/%7b/g' -e 's/|/%7c/g' -e 's/}/%7d/g' -e 's/~/%7e/g')

এটি স্ট্রিংটি $ 1 এর ভিতরে এনকোড করবে এবং এটিকে $ url এ আউটপুট দেবে। যদিও আপনি এটি চান একটি var এ লাগাতে হবে না। বিটিডাব্লু ট্যাবটির জন্য সেডকে অন্তর্ভুক্ত করে নি ভেবেছিল এটি এটিকে ফাঁকা স্থানগুলিতে পরিণত করবে


5
আমি অনুভব করি এটি এটি করার প্রস্তাবিত উপায় নয়
কোডি গ্রে

2
আপনার অনুভূতিটি দয়া করে ব্যাখ্যা করুন .... কারণ আমি যা বলেছি তা কাজ করে এবং আমি এটি বেশ কয়েকটি স্ক্রিপ্টে ব্যবহার করেছি যাতে আমি জানি এটি তালিকাভুক্ত সমস্ত অক্ষরের জন্য কাজ করে। সুতরাং দয়া করে ব্যাখ্যা করুন যে কেউ কেন আমার কোড ব্যবহার করবেন না এবং পার্ল ব্যবহার করবেন না কারণ এর শিরোনামটি "বাশ স্ক্রিপ্ট থেকে ইউআরএলএনকোড" পার্ল স্ক্রিপ্ট নয়।
manoflinux

কখনও কখনও কোনও মুক্তোর সমাধানের প্রয়োজন হয় না যাতে এটি কার্যকর হতে পারে
যুবাল রিমার

3
এটি করার জন্য এটি প্রস্তাবিত উপায় নয় কারণ ব্ল্যাকলিস্টটি খারাপ অভ্যাস, এবং যাইহোক এটি ইউনিকোডটি বন্ধুত্বপূর্ণ।
ইকভু

এটা হল সবচেয়ে বন্ধুত্বপূর্ণ সমাধান বিড়াল file.txt যাও সঙ্গে সামঞ্জস্যপূর্ণ ছিল
mrwaim


7

আপনারা যারা এমন সমাধান সমাধানের সন্ধান করছেন যা পার্লের প্রয়োজন হয় না, তাদের জন্য এখানে কেবলমাত্র হেক্সডাম্প এবং অ্যাডক প্রয়োজন:

url_encode() {
 [ $# -lt 1 ] && { return; }

 encodedurl="$1";

 # make sure hexdump exists, if not, just give back the url
 [ ! -x "/usr/bin/hexdump" ] && { return; }

 encodedurl=`
   echo $encodedurl | hexdump -v -e '1/1 "%02x\t"' -e '1/1 "%_c\n"' |
   LANG=C awk '
     $1 == "20"                    { printf("%s",   "+"); next } # space becomes plus
     $1 ~  /0[adAD]/               {                      next } # strip newlines
     $2 ~  /^[a-zA-Z0-9.*()\/-]$/  { printf("%s",   $2);  next } # pass through what we can
                                   { printf("%%%s", $1)        } # take hex value of everything else
   '`
}

নেট জুড়ে কয়েকটি জায়গা এবং কয়েকটি স্থানীয় ট্রায়াল এবং ত্রুটি থেকে একসাথে সেলাই করা। এটি দুর্দান্ত কাজ করে!


7

uni2ascii খুব সুবিধাজনক:

$ echo -ne '你好世界' | uni2ascii -aJ
%E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C

2
এই অক্ষরের জন্য না কাজ করে ভিতরে যে উদ্ধৃতি মত প্রয়োজন হওয়া ASCII পরিসীমা, %এবং স্থান (যে গত সঙ্গে সমাধান করা যায় -sপতাকা)
Boldewyn

7

আপনি যদি পার্লের উপর নির্ভর করতে না চান তবে আপনি সেডও ব্যবহার করতে পারেন। এটি কিছুটা অগোছালো, যেহেতু প্রতিটি চরিত্র পৃথকভাবে পালাতে হবে। নিম্নলিখিত বিষয়বস্তু দিয়ে একটি ফাইল তৈরি করুন এবং কল করুনurlencode.sed

s/%/%25/g
s/ /%20/g
s/ /%09/g
s/!/%21/g
s/"/%22/g
s/#/%23/g
s/\$/%24/g
s/\&/%26/g
s/'\''/%27/g
s/(/%28/g
s/)/%29/g
s/\*/%2a/g
s/+/%2b/g
s/,/%2c/g
s/-/%2d/g
s/\./%2e/g
s/\//%2f/g
s/:/%3a/g
s/;/%3b/g
s//%3e/g
s/?/%3f/g
s/@/%40/g
s/\[/%5b/g
s/\\/%5c/g
s/\]/%5d/g
s/\^/%5e/g
s/_/%5f/g
s/`/%60/g
s/{/%7b/g
s/|/%7c/g
s/}/%7d/g
s/~/%7e/g
s/      /%09/g

এটি ব্যবহার করতে নিম্নলিখিতটি করুন।

STR1=$(echo "https://www.example.com/change&$ ^this to?%checkthe@-functionality" | cut -d\? -f1)
STR2=$(echo "https://www.example.com/change&$ ^this to?%checkthe@-functionality" | cut -d\? -f2)
OUT2=$(echo "$STR2" | sed -f urlencode.sed)
echo "$STR1?$OUT2"

এটি স্ট্রিংটিকে এমন একটি অংশে বিভক্ত করবে যার এনকোডিং দরকার, এবং যে অংশটি সূক্ষ্ম হয়, সেই অংশটি যা প্রয়োজন যা এনকোড করে, তারপরে আবার সেলাই করা হবে।

আপনি এটিকে সুবিধার্থে একটি শ স্ক্রিপ্টে রাখতে পারেন, এটি এনকোড করতে একটি প্যারামিটার লাগাতে পারে, এটি আপনার পথে রাখুন এবং তারপরে আপনি কেবল কল করতে পারেন:

urlencode https://www.exxample.com?isThisFun=HellNo

সূত্র


7

আপনি জাভাস্ক্রিপ্ট এর encodeURIComponentপার্ল অনুকরণ করতে পারেন । আদেশটি এখানে:

perl -pe 's/([^a-zA-Z0-9_.!~*()'\''-])/sprintf("%%%02X", ord($1))/ge'

আপনি এটিতে বাশ ওরফে হিসাবে সেট করতে পারেন .bash_profile:

alias encodeURIComponent='perl -pe '\''s/([^a-zA-Z0-9_.!~*()'\''\'\'''\''-])/sprintf("%%%02X",ord($1))/ge'\'

এখন আপনি পাইপ করতে পারেন encodeURIComponent:

$ echo -n 'hèllo wôrld!' | encodeURIComponent
h%C3%A8llo%20w%C3%B4rld!

6

এখানে নোড সংস্করণ:

uriencode() {
  node -p "encodeURIComponent('${1//\'/\\\'}')"
}

1
যদি স্ট্রিংয়ে অন্য কোনও অক্ষর থাকে যা একক ব্যাকস্ল্যাশ, বা নিউলাইনগুলির মতো একক উদ্ধৃতিগুলির মধ্যে বৈধ নয়?
স্টুয়ার্ট পি। বেন্টলে

ভাল যুক্তি. যদি আমরা বাশের সমস্ত সমস্যাযুক্ত চরিত্রগুলি থেকে বাঁচার সমস্যায় যেতে চাই তবে আমরা সরাসরি প্রতিস্থাপনগুলি সম্পাদন করতে এবং nodeসম্পূর্ণরূপে এড়াতে পারি । আমি একটি বাশ-কেবল সমাধান পোস্ট করেছি। :)
ডেভিডচ্যাম্বার

1
পৃষ্ঠায় অন্য কোথাও পাওয়া এই বৈকল্পিকটি এসটিডিআইএন থেকে মূল্য পড়ার মাধ্যমে উদ্ধৃতি ইস্যুটিকে এড়িয়ে চলে:node -p 'encodeURIComponent(require("fs").readFileSync(0))'
মার্ক স্টোসবার্গ

6

প্রশ্নটি এটি ব্যাশে করা সম্পর্কে এবং পাইথন বা পার্লের কোনও প্রয়োজন নেই কারণ বাস্তবে একটি একক আদেশ রয়েছে যা আপনাকে যা চায় ঠিক তা করে - "ইউরেনকোড"।

value=$(urlencode "${2}")

উপরের পার্ল উত্তর হিসাবে এটি আরও ভাল, উদাহরণস্বরূপ, সমস্ত অক্ষর সঠিকভাবে এনকোড করে না। আপনি ওয়ার্ড থেকে আসা দীর্ঘ ড্যাশ দিয়ে চেষ্টা করে দেখুন এবং আপনার ভুল এনকোডিং রয়েছে।

দ্রষ্টব্য, এই কমান্ডটি সরবরাহ করতে আপনার "গ্রিডসাইট-ক্লায়েন্ট" ইনস্টল করা দরকার।


1
আমার বাশ (GNU 3.2) সংস্করণটি নেই urlencode। আপনি কি সংস্করণ ব্যবহার করছেন?
শ্রীধর সারনোবাত

1
আমার কাছে ৪.৩.৪২ রয়েছে, তবে ইউরেনকোড কমান্ডটি "গ্রিডসাইট-ক্লায়েন্ট" সরবরাহ করেছে। এটি ইনস্টল করার চেষ্টা করুন এবং আপনার ভাল হওয়া উচিত।
ডিলান

5
সুতরাং আপনার উত্তর
অন্যটির জন্য

কেবল এটির জন্য একটি সম্পূর্ণ ভাষা (এবং গ্রন্থাগার) এর পরিবর্তে কেবলমাত্র একটি একক উপযোগ ইনস্টল করা দরকার, এটি কী করছে তা দেখতে আরও সহজ এবং স্পষ্ট।
ডিলান

এই কমান্ডটি সরবরাহকারী প্যাকেজ / প্রকল্প পৃষ্ঠার জন্য প্রথমে একটি লিঙ্ক কার্যকর হবে।
ডোরন বিহার


4

রুবি, সম্পূর্ণতার জন্য

value="$(ruby -r cgi -e 'puts CGI.escape(ARGV[0])' "$2")"

4

আরেকটি পিএইচপি পদ্ধতি:

echo "encode me" | php -r "echo urlencode(file_get_contents('php://stdin'));"

2
echoএকটি নতুন লাইন অক্ষর (হেক্স 0xa) যুক্ত হবে। এটি করা বন্ধ করতে, ব্যবহার করুন echo -n
ম্যাথিউ হল

3

এম্বেড থাকা সিস্টেমের জন্য ব্যস্তবক্স অ্যাশ শেলের জন্য আমার সংস্করণটি এখানে রয়েছে, আমি মূলত অরওলোফিলের রূপটি গ্রহণ করেছি:

urlencode()
{
    local S="${1}"
    local encoded=""
    local ch
    local o
    for i in $(seq 0 $((${#S} - 1)) )
    do
        ch=${S:$i:1}
        case "${ch}" in
            [-_.~a-zA-Z0-9]) 
                o="${ch}"
                ;;
            *) 
                o=$(printf '%%%02x' "'$ch")                
                ;;
        esac
        encoded="${encoded}${o}"
    done
    echo ${encoded}
}

urldecode() 
{
    # urldecode <string>
    local url_encoded="${1//+/ }"
    printf '%b' "${url_encoded//%/\\x}"
}

2

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

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

উদাহরণ:

value=$(encodeURIComponent "$2")

সূত্র


2

লুয়া ব্যবহার করে এখানে এক-লাইন রূপান্তর, নীল বর্ণের উত্তরের মতো একইভাবে সমস্ত আরএফসি 3986 অনাবৃত অক্ষরবিহীন অক্ষরযুক্ত ( এই উত্তরটির মতো ) বাদে :

url=$(echo 'print((arg[1]:gsub("([^%w%-%.%_%~])",function(c)return("%%%02X"):format(c:byte())end)))' | lua - "$1")

অতিরিক্তভাবে, আপনার স্ট্রিংয়ের নতুন লাইনগুলি এলএফ থেকে সিআরএলএফতে রূপান্তরিত হয়েছে তা নিশ্চিত করার প্রয়োজন হতে পারে, gsub("\r?\n", "\r\n")সেক্ষেত্রে আপনি শতাংশ-এনকোডিংয়ের আগে শৃঙ্খলে একটি সন্নিবেশ করতে পারেন ।

এখানে একটি বৈকল্পিক যা অ্যাপ্লিকেশন / x-www-form-urlencoded এর অ-স্ট্যান্ডার্ড শৈলীতে , এটি নতুন লাইনের স্বাভাবিককরণের পাশাপাশি '% 20' এর পরিবর্তে '+' হিসাবে স্থানগুলি এনকোডিং করে (যা সম্ভবত এতে যুক্ত হতে পারে অনুরূপ কৌশল ব্যবহার করে পার্ল স্নিপেট)।

url=$(echo 'print((arg[1]:gsub("\r?\n", "\r\n"):gsub("([^%w%-%.%_%~ ]))",function(c)return("%%%02X"):format(c:byte())end):gsub(" ","+"))' | lua - "$1")

1

পিএইচপি ইনস্টল করা আমি এইভাবে ব্যবহার করি:

URL_ENCODED_DATA=`php -r "echo urlencode('$DATA');"`

1

এটি অরওলোফিলের উত্তরের ksh সংস্করণ যা কাঁচারলেঙ্কোড এবং কাঁচাবার্ডিকোড ফাংশন (লিঙ্ক: কার্ল কমান্ডের জন্য কীভাবে ইউরেলকোড ডেটা করবেন? ) রয়েছে answer আমার কাছে কোনও মন্তব্য পোস্ট করার মতো যথেষ্ট প্রতিনিধি নেই, সুতরাং নতুন পোস্টটি ..

#!/bin/ksh93

function rawurlencode
{
    typeset string="${1}"
    typeset strlen=${#string}
    typeset encoded=""

    for (( pos=0 ; pos<strlen ; pos++ )); do
        c=${string:$pos:1}
        case "$c" in
            [-_.~a-zA-Z0-9] ) o="${c}" ;;
            * )               o=$(printf '%%%02x' "'$c")
        esac
        encoded+="${o}"
    done
    print "${encoded}"
}

function rawurldecode
{
    printf $(printf '%b' "${1//%/\\x}")
}

print $(rawurlencode "C++")     # --> C%2b%2b
print $(rawurldecode "C%2b%2b") # --> C++

1

জাভাস্ক্রিপ্টের চেয়ে আরও কীভাবে ইউআরএল পার্স করা যায়?

node -p "encodeURIComponent('$url')"

বিকল্প প্রশ্নের সুযোগের বাইরে। বাশ নয়, কার্ল নয়। এমনকি যদি আমি নিশ্চিত নোড উপলব্ধ থাকে তবে খুব ভাল কাজ করে।
সাইরিল পন্টভিউক্স

কেন এটিকে কেন ভোট দেওয়া হচ্ছে এবং অজগর / পার্ল উত্তরগুলি দেওয়া হচ্ছে না? এছাড়াও এটি কীভাবে আসল প্রশ্নের প্রতিক্রিয়া জানায় না "কার্ল কমান্ডের জন্য কীভাবে ডেটার urlncode করবেন?" এটি ব্যাশ স্ক্রিপ্ট থেকে ব্যবহার করা যেতে পারে এবং ফলাফলটি কার্ল কমান্ডকে দেওয়া যেতে পারে।
নেস্টর আরকিউজা

আমি অন্যদেরও ভোট দিয়েছি। প্রশ্নটি কীভাবে এটি বাশ স্ক্রিপ্টে করবেন। যদি নোড / জেএস, পাইথন বা পার্লের মতো অন্য ভাষা ব্যবহার করা হয় তবে সরাসরি কার্ল ব্যবহার করার দরকার নেই।
সাইরিল পন্টভিয়াক্স 3'17

2
যদিও আমি ডাউনওয়েট করতে বিরক্ত করি নি, এই কমান্ডটির সাথে সমস্যাটি হ'ল জাভাস্ক্রিপ্টে ব্যবহারের জন্য ডেটা সঠিকভাবে এড়ানো দরকার। একক উদ্ধৃতি এবং কিছু ব্যাকস্ল্যাশ উন্মাদনা দিয়ে চেষ্টা করুন। আপনি যদি নোড ব্যবহার করতে চান তবে node -p 'encodeURIComponent(require("fs").readFileSync(0))'
স্টিডিনের

1
আপনি যদি STDIN থেকে ডেটা পাইপ করে থাকেন তবে মাইকেল ক্রেলিন-হ্যাকারের সমাধানটি সম্পর্কে সতর্ক হন make উদাহরণস্বরূপ, echo | ...ভুল, echo -n | ...নতুন লাইনে দমন করার সময় ।
মার্ক স্টোসবার্গ

0

নিম্নলিখিতটি অরওলোফিলের উত্তরের ভিত্তিতে তৈরি হয়েছে, তবে মন্তব্যে উল্লিখিত মাল্টবাইট বাগটি LC_ALL = C (vte.sh এর কৌশল) সেট করে সমাধান করে। আমি এটিকে ফাংশন উপযুক্ত PROMPT_COMMAND আকারে লিখেছি, কারণ এটিই আমি এটি ব্যবহার করি।

print_path_url() {
  local LC_ALL=C
  local string="$PWD"
  local strlen=${#string}
  local encoded=""
  local pos c o

  for (( pos=0 ; pos<strlen ; pos++ )); do
     c=${string:$pos:1}
     case "$c" in
        [-_.~a-zA-Z0-9/] ) o="${c}" ;;
        * )               printf -v o '%%%02x' "'$c"
     esac
     encoded+="${o}"
  done
  printf "\033]7;file://%s%s\007" "${HOSTNAME:-}" "${encoded}"
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.