আপনি কীভাবে বাশে একটি 4-অঙ্কের ইউনিকোড অক্ষর প্রতিধ্বন করবেন?


224

আমি আমার শেল প্রম্পটে ইউনিকোড খুলি এবং ক্রসবোনগুলি যুক্ত করতে চাই (বিশেষত 'দক্ষ এবং ক্রসবোনস' (ইউ + 2620)), তবে ইকো স্পিট করার জন্য যাদু জাদুটি আবিষ্কার করতে পারি না, বা অন্য কোনও, 4-অঙ্কের ইউনিকোড অক্ষর। দুই অঙ্কের একটি সহজ। উদাহরণস্বরূপ, ইকো -e "\ x55",।

নীচের উত্তরগুলি ছাড়াও এটি অবশ্যই লক্ষ করা উচিত যে স্পষ্টতই, আপনার টার্মিনালটির ইউনিকোডকে আউটপুটটি আপনার প্রত্যাশা মতো করতে সহায়তা করতে হবে। জিনোম-টার্মিনাল এটির একটি ভাল কাজ করে তবে এটি ডিফল্টরূপে চালু হয় না।

ম্যাকোসের টার্মিনাল অ্যাপ্লিকেশনে পছন্দসমূহ> এনকোডিংগুলিতে যান এবং ইউনিকোড (ইউটিএফ -8) চয়ন করুন।


7
মনে রাখবেন যে আপনার "2 ডিজিটের সহজ (প্রতিধ্বনিতে)" মন্তব্যটি কেবলমাত্র "\x7F"ইউটিএফ -8 স্থানীয় স্তরের মানগুলির জন্য বৈধ (যা bashট্যাগটি আপনার প্রস্তাব দেয়) ... একক বাইট দ্বারা উপস্থাপিত নিদর্শনগুলি কখনই পরিসরে থাকে না \x80-\xFF। এই ব্যাপ্তিটি সিঙ্গল-বাইট ইউটিএফ -8 অক্ষরে অবৈধ। উদাহরণস্বরূপ, ইউনিকোড কোডপয়েন্টের মান U+0080(যেমন \x80) ইউটিএফ -8 এ আসলে 2 বাইট হয় .. \xC2\x80..
পিটার.ও

4
যেমন printf "\\u007C\\u001C"
কেনারব

এনবি: আমার জন্য gnome-terminal, echo -e '\ufc'ইউটিএফ -8 এ অক্ষর এনকোডিং সহ এমনকি একটি produce উত্পাদন করে না। তবে, যেমন urxvtপ্রিন্ট করে যেমন printf "\\ub07C\\ub01C"প্রত্যাশিত (কোনও বা বাক্সের সাথে নয়)।
isomorphismes

@ পিটার.ও bashট্যাগটি কেন এমন দরকারী ইঙ্গিতযুক্ত ? সিজেকেতে কি বিভিন্ন টার্মিনালগুলি সাধারণ বা…?
isomorphismes

1
@ পিটার.ও জেডএস, ফিশ, স্ক্যাশ, এলভিশ ইত্যাদি ... বিভিন্ন ধরণের শেল রয়েছে, তারা ইউনিকোড চরিত্রগুলি পরিচালনা করতে পারে তবে তারা চায় (না)। "বাশ" এটি পরিষ্কার করে দেয় যে এই প্রশ্নটি এমন কিছু অদ্ভুত শেল নয় যা বিভিন্নভাবে কাজ করে about
মাসুকোমি

উত্তর:


237

ইউটিএফ -8 এ এটি আসলে 6 ডিজিট (বা 3 বাইট)।

$ printf '\xE2\x98\xA0'

এটি কনসোল দ্বারা কীভাবে এনকোড হয়েছে তা পরীক্ষা করতে, হেক্সডাম্প ব্যবহার করুন:

$ printf  | hexdump
0000000 98e2 00a0                              
0000003

5
আমার আউটপুটগুলি এর পরিবর্তে " " ... কেন?
trusktr

8
সেটা সত্য. আমি আবিষ্কার করেছি আমি এর LANG=Cপরিবর্তে ব্যবহার করছি LANG=en_US.UTF-8। এখন জিনোমে আমার টার্মিনালগুলি সঠিকভাবে প্রতীকগুলি দেখায় ... আসল টার্মিনালগুলি (tty1-6) এখনও না।
trusktr

6
হ্যাক্সডাম্প চেষ্টা করে এমন লোকদের জন্য: 0000000 f0 9f 8d baঅনুবাদ করে \xf0\x9f\x8d\xba। উদাহরণ echo: echo -e "\xf0\x9f\x8d\xba"
28:25

8
আপনি $'...'এনকোডেড চরিত্রটিকে কোনও ভেরিয়েবলের কাছে $(...)ক্যাপচারিং সাবશેল ব্যবহার না করে , প্রাসঙ্গিকগুলিতে ব্যবহার করতে ব্যবহার করতে পারেন যা নিজেরাই পালানোর অনুক্রমের ব্যাখ্যা দেয় না: skull=$'\xE2\x98\xA0'
সিন্ডেক্সটিও

7
হেক্সডাম্প সম্পর্কে আরও একটি বিষয়: আমার মেশিনে, উত্তর আউটপুটগুলিতে দ্বিতীয় কমান্ড 0000000 98e2 00a0। অবশ্যই 0000000এটি একটি অপ্রয়োজনীয় অফসেট, তবে এটির পরে বাইটগুলি অনুবাদ করে \xe2\x98\xa0, কারণ মেশিনটি সামান্য এন্ডিয়ান বাইট ক্রম ব্যবহার করে।
সিগালোর

98
% echo -e '\u2620'     # \u takes four hexadecimal digits

% echo -e '\U0001f602' # \U takes eight hexadecimal digits
😂

এটি Zsh (আমি সংস্করণ ৪.৩ পরীক্ষা করেছি) এবং বাশ ৪.২ বা আরও নতুনতে কাজ করে।


16
আমি যখন এটি করি তখন কেবল তা ছড়িয়ে যায়।
মাসুকোমি

আমার জন্যও. জুলিয়ানো আপনি কোন শেল ব্যবহার করছেন?
জোছিম সউর

2
দুঃখিত, আমি zsh ব্যবহার করে বলতে ভুলে গেছি।
জুলিয়ানো

32
বাশ ৪.২-এ আপনার সমর্থন যোগ করা হয়েছিল।
ল্রি

4
আমার জন্য ম্যাক ওএস 10.14.2, ব্যাশ কাজ করে না (জিএনইউ ব্যাশ, সংস্করণ 3.2.57 (1) -রিলিজ (x86_64-আপেল-ডারউইন 18))। এটি কেবল ইনপুটটি প্রিন্ট করে - $ ইকো-ই '\ u2620' <এন্টার> সহজভাবে প্রিন্ট করে: \ u2620
মতি শ্নিয়র

68

এতক্ষণ আপনার পাঠ্য-সম্পাদকরা ইউনিকোডের সাথে লড়াই করতে পারবেন (সম্ভবত ইউটিএফ -8 এ এনকোডেড) আপনি সরাসরি ইউনিকোড কোড-পয়েন্টে প্রবেশ করতে পারেন।

উদাহরণস্বরূপ, মধ্যে তেজ টেক্সট সম্পাদক আপনি সন্নিবেশ মোড এবং এন্টার টিপুন হবে Ctrl+ + V+ + Uএবং তারপর (শূন্য প্রয়োজনে সঙ্গে প্যাড) একটি 4 ডিজিটের হেক্সাডেসিমেল সংখ্যা হিসাবে কোড দফা সংখ্যা। সুতরাং আপনি টাইপ করতে হবে Ctrl+ + V+ + U 2 6 2 0। দেখুন: নথিতে ইউনিকোড অক্ষর inোকানোর সহজতম উপায় কী?

প্রান্তিক চলমান ব্যাশ এ আপনি টাইপ হবে CTRL+ + SHIFT+ + Uএবং চরিত্র যদি আপনি চান এর হেক্সাডেসিমেল কোড দফা টাইপ করুন। ইনপুট চলাকালীন আপনার কার্সারটি একটি আন্ডারলাইন করা উচিত u। আপনি যে প্রথম অ-অঙ্কটি টাইপ করেন তা শেষ হয় ইনপুট, এবং অক্ষরটি সরবরাহ করে। সুতরাং আপনি নিম্নলিখিতটি ব্যবহার করে ব্যাশের মধ্যে ইউ + 2620 মুদ্রণ করতে সক্ষম হতে পারেন:

echo CTRL+ SHIFT+U2620ENTERENTER

(প্রথম প্রবেশদ্বারটি ইউনিকোড ইনপুটটি শেষ করে এবং দ্বিতীয়টি echoকমান্ডটি চালায় )

ক্রেডিট: উবুন্টু এসই কে জিজ্ঞাসা করুন


1
হেক্সাডেমিকাল কোড পয়েন্টগুলির জন্য একটি ভাল উত্স হ'ল ইউনিকোডেলুকআপ.com
#

1
আমি যে ভিএমটি ব্যবহার করছি তার সংস্করণটি (আরএইচইএল .3.৩ এ 7.২.৪১) সিআরটিএল-ভি এবং ইউ এর মধ্যে কোনও বিন্দু থাকলে পছন্দসই হিসাবে সাড়া দেয় না, তবে সেই বিন্দুটি বাদ দিলে ঠিক কাজ করে।
ক্রিস জনসন

@ ক্রিস জোনসন: আমি সময়কালটি নির্দেশাবলী থেকে সরিয়েছি, এটি কোনও মূল প্রেস হওয়ার উদ্দেশ্য ছিল না (যার কারণে এটি কীবোর্ডের সাথে প্রদর্শিত হয়নি)। বিভ্রান্তির জন্য দুঃখিত.
রবএম

5
সাবধান: এটি জিএনকে + পরিবেশের অধীনে , জিনোম হিসাবে চালিত হলেই বাশ চলমান টার্মিনালে কাজ করে ।
এনআর

1
ক্ষমতাটি C-S-u 2 6 2 0আপনার টার্মিনাল এমুলেটর, এক্স ইনপুট পদ্ধতি (এক্সআইএম), বা অনুরূপ। আফাইক, আপনি উভয় SHIFTএবং CTRLটার্মিনাল স্তরটিতে পাঠাতে অক্ষম হবেন । টার্মিনালটি আপনার এক্স সার্ভারের মতো কী-কোড এবং কীডকোডের পরিবর্তে কেবল অক্ষরগুলিতে কথা বলে (এটি সমস্ত উদ্দেশ্য এবং উদ্দেশ্যগুলির জন্য 7-বিট)। এই বিশ্বে, CTRL4 টি সবচেয়ে গুরুত্বপূর্ণ বিট (& 0b00001111) মাস্ক করুন যার ফলস্বরূপ
নবীন-তথ্য

31

এখানে সম্পূর্ণরূপে অভ্যন্তরীণ বাশ বাস্তবায়ন, ইউনিকোডের অক্ষরের সীমাহীন আকার নয় king

fast_chr() {
    local __octal
    local __char
    printf -v __octal '%03o' $1
    printf -v __char \\$__octal
    REPLY=$__char
}

function unichr {
    local c=$1    # Ordinal of char
    local l=0    # Byte ctr
    local o=63    # Ceiling
    local p=128    # Accum. bits
    local s=''    # Output string

    (( c < 0x80 )) && { fast_chr "$c"; echo -n "$REPLY"; return; }

    while (( c > o )); do
        fast_chr $(( t = 0x80 | c & 0x3f ))
        s="$REPLY$s"
        (( c >>= 6, l++, p += o+1, o>>=1 ))
    done

    fast_chr $(( t = p | c ))
    echo -n "$REPLY$s"
}

## test harness
for (( i=0x2500; i<0x2600; i++ )); do
    unichr $i
done

আউটপুটটি ছিল:

─━│┃┄┅┆┇┈┉┊┋┌┍┎┏
┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟
┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯
┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿
╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏
═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟
╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯
╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏
▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯
▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿
◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●
◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟
◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯
◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿

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

14

আপনার শেল স্ক্রিপ্টে কেবল "☠" রাখুন। সঠিক লোকালে এবং একটি ইউনিকোড-সক্ষম সক্ষম কনসোলে এটি ঠিক জরিমানা মুদ্রণ করবে:

$ echo 

$

একটি কুৎসিত "workaround" হবে ইউটিএফ -8 ক্রম আউটপুট করা, তবে এটি ব্যবহৃত এনকোডিংয়ের উপরও নির্ভর করে:

$ echo -e '\xE2\x98\xA0'

$

13

ইউটিএফ -8 অক্ষরগুলিকে তাদের 3 বাইট বিন্যাসে রূপান্তর করতে দ্রুত ওয়ান-লাইনার:

var="$(echo -n '☠' | od -An -tx1)"; printf '\\x%s' ${var^^}; echo

5
আমি উপরের উদাহরণটিকে দ্রুত (11 টি কমান্ড এবং তাদের প্যারাম সহ) কল করব না ... এছাড়াও এটি কেবল 3 বাইট ইউটিএফ -8 চার্স পরিচালনা করে (ইউটিএফ -8 অক্ষর 1, 2, বা 3 বাইট হতে পারে) ... এটি কিছুটা খাটো এবং 1-3 +++++ বাইটের জন্য কাজ করে: printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u).... xxd '
ভিএম

পিএস: আমি কেবল লক্ষ্য করেছি যে উপরের হেক্সডাম্প / অ্যাডাব্লিক উদাহরণটি বাইট-জোড়ায় বাইটের ক্রমটি swithching করছে। এটি কোনও ইউটিএফ -8 ডাম্পের জন্য প্রযোজ্য নয় । এটি যদি ইউটিএফ -16 এল এর ডাম্প হত এবং ইউনিকোড কোডপয়েন্টগুলিকে আউটপুট করতে চেয়েছিল তবে এটি সম্পর্কিত হবে would -জোড়া)
পিটার.ও

7
ইউটিএফ -8 অক্ষর 1 - 4 বাইট সিকোয়েন্স হতে পারে
সেমি

1
@ পিটার.ও-এর মন্তব্যের ভিত্তিতে আমি নিম্নলিখিতগুলি দেখতে পেয়েছি, যদিও এটি বেশ বড়, বেশ সুশোভিত:hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
স্টিফেনিয়াগ

2
ভাল godশ্বর মানুষ। বিবেচনা করুন: codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z ... ভোগ 👍
নবীন-তথ্য

8

আমি এটি ব্যবহার করছি:

$ echo -e '\u2620'

এটি একটি হেক্স প্রতিনিধিত্ব অনুসন্ধানের চেয়ে বেশ সহজ ... আমি এটি আমার শেল স্ক্রিপ্টগুলিতে ব্যবহার করছি। এটি জিনোম-টার্ম এবং urxvt এএফআইকে-তে কাজ করে।


2
@ মাসুকমি যদি আপনি কীভাবে ব্রিবু ব্যবহার করতে জানেন তবে আপনি আরও সাম্প্রতিক ব্যাশ ইনস্টল করতে পারেন এবং এটি ব্যবহার করতে পারেন। আপগ্রেড করা ব্যাশ ব্যবহার করার সময় উপরেরগুলি আমার ম্যাক টার্মিনালটিতে সূক্ষ্মভাবে কাজ করে।
mcheema

হ্যাঁ, এটি নতুন সংস্করণের বাশের সাথে ঠিক আছে। Hower প্রম্পট স্ট্রিং, যেমন $ PS1 প্রতিধ্বনি পালাবার ফরম্যাটের ব্যবহার করবেন না
CMS

6

প্রম্পট প্রসারণটি সঠিকভাবে ডিকোড করার জন্য আপনার কোড পয়েন্টটি অক্টোটাল হিসাবে এনকোডের প্রয়োজন হতে পারে।

ইউটিএফ -8 হিসাবে ইউ + 2620 এনকোডেড E2 98 A0।

সুতরাং বাশ,

export PS1="\342\230\240"

আপনার শেলটি খুলি এবং হাড়গুলিতে প্রম্পট করবে।


হাই, "e0 বি 6 85" এর জন্য আমার কোডটি কী লিখতে হবে? আমি এটি কিভাবে খুঁজে পেতে পারি?
উদয়নথা উদী ওয়ার্নসুরিয়া

কেবলমাত্র হেক্সাডেসিমাল (বেস 16) সংখ্যা ই0 বি 6 85 কে অক্টোটাল (বেস 8) এ রূপান্তর করুন - একটি ক্যালকুলেটর ব্যবহার সম্ভবত এটি করার সবচেয়ে সহজ উপায়
সেমি

e0 বি 6 85 হেক্স 340 266 205 অক্টাল
সেমি

এটি কাজ করেছে, অনেক অনেক ধন্যবাদ! এবং বিটিডব্লিউ, আপনি এই পৃষ্ঠাগুলিতে অষ্টাল
পার্ল্নিকা

6

আউটপুট থেকে ইউনিকোড অক্ষর মুদ্রণের জন্য ব্যাশে \ x, \ u বা \ U ব্যবহার করুন (2 ডিজিটের হেক্সের জন্য প্রথম, 4 ডিজিটের হেক্সের জন্য দ্বিতীয়, কোনও দৈর্ঘ্যের জন্য তৃতীয়)

echo -e '\U1f602'

আমি আপনাকে এটিকে একটি পরিবর্তনশীল ... '...' সিনট্যাক্সের জন্য বরাদ্দ করতে চাই

x=$'\U1f602'
echo $x

5

আপনি যদি পার্ল ওয়ান-লাইনারটিকে কিছু মনে করেন না:

$ perl -CS -E 'say "\x{2620}"'

-CSইনপুটটিতে ইউটিএফ -8 ডিকোডিং এবং আউটপুটটিতে ইউটিএফ -8 এনকোডিং সক্ষম করে। সক্ষম -Eহিসাবে আধুনিক বৈশিষ্ট্যগুলি সহ পরের আর্গুমেন্টকে পার্ল হিসাবে মূল্যায়ন করে say। আপনি যদি শেষে কোনও নিউলাইন না চান তবে printপরিবর্তে ব্যবহার করুন say


5

এই তিনটি কমান্ডের যে কোনওটি আপনার পছন্দসই অক্ষরটি কনসোলে মুদ্রণ করবে, তবে কনসোলটি ইউটিএফ -8 গ্রহণ না করে অক্ষরটি অক্ষর (বেশিরভাগ বর্তমানের লোকেরা করে):

echo -e "SKULL AND CROSSBONES (U+2620) \U02620"
echo $'SKULL AND CROSSBONES (U+2620) \U02620'
printf "%b" "SKULL AND CROSSBONES (U+2620) \U02620\n"

SKULL AND CROSSBONES (U+2620) 

এর পরে, আপনি যে কোনও (ইউটিএফ -8 সক্ষম) পাঠ্য সম্পাদককে প্রকৃত গ্লাইফ (চিত্র, চরিত্র) অনুলিপি করতে এবং আটকে দিতে পারেন।

ইউটিএফ -8 এ কীভাবে ইউনিকোড কোড পয়েন্টটি এনকোড করা হয়েছে তা যদি আপনার দেখতে হয় তবে এক্সএক্সডি ব্যবহার করুন (ওডের চেয়ে আরও ভাল হেক্স ভিউয়ার):

echo $'(U+2620) \U02620' | xxd
0000000: 2855 2b32 3632 3029 20e2 98a0 0a         (U+2620) ....

That means that the UTF8 encoding is: e2 98 a0

বা, ত্রুটিগুলি এড়ানোর জন্য এইচএক্সে: 0xE2 0x98 0xA0। এটি হ'ল স্পেস (এইচএক্স 20) এবং লাইন-ফিড (হেক্স 0 এ) এর মধ্যে মানগুলি।

আপনি যদি সংখ্যাকে চরগুলিতে রূপান্তর করতে একটি গভীর ডুব চান: বাশ-এ ASCII এনকোডিং সম্পর্কে গ্রেগের উইকি (বাশফাক) থেকে একটি নিবন্ধ দেখতে এখানে দেখুন !


পুনরায়: "অথবা, ত্রুটিগুলি এড়ানোর জন্য এইএইএক্স-তে ..." আমি খুব কমই মনে করি যে আপনি হেক্স অক্ষরে প্রকাশ করেছেন এমন কোনও বাইনারি এনকোডিংয়ে ইউনিকোড চরকে রূপান্তর করা ত্রুটিগুলি এড়াতে সহায়তা করে । "ব্যাশ" -তে ইউনিকোড স্বরলিপি ব্যবহার করা ত্রুটিগুলি আরও ভালভাবে এড়াতে পারে যেমন: "\ uHHHH --- ইউনিকোড (আইএসও / আইসিসি 10646) অক্ষর যার মান ---- হেক্সাডেসিমাল মান এইচএইচএইচএইচ (এক থেকে চারটি হেক্স অঙ্ক); H ইউএইচএইচএইচএইচএইচএইচএইচএইচএইচ ---- ইউনিকোড (আইএসও / আইইসি 10646) অক্ষর যার মান ---- হেক্সাডেসিমাল মান এইচএইচএইচএইচএইচএইচএইচএইচএইচএইচ (এক থেকে আটটি হেক্স অঙ্ক)
আস্তারা

4

printfBuiltin (ঠিক coreutils 'হিসেবে printf) জানে \uপালাবার ক্রম যা 4 সংখ্যার ইউনিকোড অক্ষর স্বীকার করে:

   \uHHHH Unicode (ISO/IEC 10646) character with hex value HHHH (4 digits)

বাশ 4.2.37 (1) দিয়ে পরীক্ষা করুন:

$ printf '\u2620\n'

প্রিন্টএফ হ'ল বিল্ট-ইন শেল। আপনি সম্ভবত ডিফল্ট ম্যাকোস ব্যাশ (v3) ব্যবহার করছেন। দিয়ে চেষ্টা \printfস্বতন্ত্র এক্সিকিউটেবল ব্যবহার করুন, অথবা আপগ্রেড ব্যাশ সঙ্গে চেষ্টা করতে
mcint

4

এই পুরানো প্রশ্ন পুনরুদ্ধার জন্য দুঃখিত। কিন্তু ব্যবহার করার bashসময় প্লেইন এএসসিআইআই ইনপুট থেকে ইউনিকোড কোডপয়েন্টগুলি তৈরি করার জন্য খুব সহজ পদ্ধতি রয়েছে যা এমনকি একেবারেই কাঁটাচামচ করে না :

unicode() { local -n a="$1"; local c; printf -vc '\\U%08x' "$2"; printf -va "$c"; }
unicodes() { local a c; for a; do printf -vc '\\U%08x' "$a"; printf "$c"; done; };

নির্দিষ্ট কোডপয়েন্টগুলি সংজ্ঞায়িত করতে নীচে এটি ব্যবহার করুন

unicode crossbones 0x2620
echo "$crossbones"

বা প্রথম 65536 ইউনিকোড কোডপয়েন্টগুলিকে স্টাডাউটে ফেলে দিতে হবে (আমার মেশিনে 2s এরও কম সময় লাগে takes অতিরিক্ত স্থানটি শেলের মোনোস্পেস ফন্টের কারণে নির্দিষ্ট অক্ষরগুলিকে একে অপরের মধ্যে প্রবাহিত করতে বাধা দেয়):

for a in {0..65535}; do unicodes "$a"; printf ' '; done

বা কিছু খুব সাধারণ পিতামাতার গল্প বলতে (এটি ইউনিকোড 2010 প্রয়োজন):

unicodes 0x1F6BC 32 43 32 0x1F62D 32 32 43 32 0x1F37C 32 61 32 0x263A 32 32 43 32 0x1F4A9 10

ব্যাখ্যা:

  • printf '\UXXXXXXXX' যে কোনও ইউনিকোড অক্ষর মুদ্রণ করে
  • printf '\\U%08x' number কপি করে প্রিন্ট \UXXXXXXXX রূপান্তরিত নম্বরযুক্ত , এরপরে printfএটি ইউনিকোড অক্ষরটি মুদ্রণ করতে অন্যকে খাওয়ানো হয়
  • printf অষ্টাল (0oct), হেক্স (0xHX) এবং দশমিক (0 বা 9 থেকে শুরু হওয়া সংখ্যা) সংখ্যা হিসাবে স্বীকৃতি দেয়, তাই আপনি যে কোনও উপস্থাপনা সেরা ফিট করতে পারেন তা বেছে নিতে পারেন
  • printf -v var ..কাঁটাচামচ ছাড়াই আউটপুটটিকে printfএকটি ভেরিয়েবলে জড়ো করে (যা জিনিসকে দুর্দান্তভাবে গতি দেয়)
  • local variable বিশ্বব্যাপী নেমস্পেস দূষিত না করার জন্য কি আছে
  • local -n var=otheralias লেখা varথেকে other, এর যেমন যে নিয়োগ varগন্ধে পরিবর্তন other। এখানে একটি আকর্ষণীয় অংশ হ'ল varএটি স্থানীয় নেমস্পেসের অংশ, যখনother অংশ, এবং বিশ্বব্যাপী নেমস্পেসের অংশ।
    • দয়া করে মনে রাখবেন যে নাম localবা globalস্থানের মতো কোনও জিনিস নেই bash। চলকগুলি পরিবেশে রাখা হয় এবং এগুলি সর্বদা বিশ্বব্যাপী। স্থানীয় কেবল বর্তমান মানটি ফেলে দেয় এবং ফাংশনটি আবার রেখে গেলে পুনরুদ্ধার করে। ফাংশনটির মধ্য দিয়ে কল করা অন্যান্য ফাংশনগুলি localএখনও "স্থানীয়" মানটি দেখতে পাবে। এটি অন্যান্য ভাষায় পাওয়া সমস্ত সাধারণ স্কোপিং বিধিগুলির তুলনায় মৌলিকভাবে আলাদা ধারণা (এবং যা bashখুব শক্তিশালী তা কিন্তু যদি আপনি কোনও প্রোগ্রামার হন তবে এটি সম্পর্কে অবগত নন তবে ত্রুটির কারণ হতে পারে)।

ভাল - আমার পক্ষে মোটেও কাজ করে না। আপনার যে কোনও ক্রিয়াকলাপটি ব্যবহারের যে কোনও প্রয়াস, প্রেরণ: লাইন:: স্থানীয়: -এন: অবৈধ বিকল্প স্থানীয়: ব্যবহার: স্থানীয় নাম [= মান] ... আমি সর্বশেষ (10.14.2) ম্যাকোস এবং ব্যাশ (জিএনইউ ব্যাশ) ব্যবহার করছি , সংস্করণ 3.2.57 (1) -রিলেজ (x86_64-আপেল-ডারউইন 18))
মোটি শ্নিওর

4

এখানে সমস্ত ইউনিকোড ইমোজিগুলির উপলব্ধ একটি তালিকা রয়েছে:

https://en.wikipedia.org/wiki/Emoji#Unicode_blocks

উদাহরণ:

echo -e "\U1F304"
🌄

এই অক্ষরের ASCII মান পেতে হেক্সডাম্প ব্যবহার করুন

echo -e "🌄" | hexdump -C

00000000  f0 9f 8c 84 0a                                    |.....|
00000005

এবং তারপরে হেক্স ফর্ম্যাটে অবহিত মানগুলি ব্যবহার করুন

echo -e "\xF0\x9F\x8C\x84\x0A"
🌄

cho U <hex> স্ট্রিং প্রতিধ্বনিত হওয়া ওএসএক্সে কাজ করে না এটি কোটগুলির ঠিক ঠিক আউটপুট দেয়।
মাসুকোমি

2

স্ট্যাক ওভারফ্লো প্রশ্নগুলির উপর ভিত্তি করে ইউনিক্স কাটা, প্রথমে টোকেন এবং https://stackoverflow.com/a/15903654/781312 সরান :

(octal=$(echo -n  | od -t o1 | head -1 | cut -d' ' -f2- | sed -e 's#\([0-9]\+\) *#\\0\1#g')
echo Octal representation is following $octal
echo -e "$octal")

আউটপুট নিম্নলিখিত।

Octal representation is following \0342\0230\0240

2

পাইথন 2/3 ওয়ান-লাইনারের সাহায্যে সহজ:

$ python -c 'print u"\u2620"'    # python2
$ python3 -c 'print(u"\u2620")'  # python3

ফলাফল স্বরূপ:


2

বাশে:

UnicodePointToUtf8()
{
    local x="$1"               # ok if '0x2620'
    x=${x/\\u/0x}              # '\u2620' -> '0x2620'
    x=${x/U+/0x}; x=${x/u+/0x} # 'U-2620' -> '0x2620'
    x=$((x)) # from hex to decimal
    local y=$x n=0
    [ $x -ge 0 ] || return 1
    while [ $y -gt 0 ]; do y=$((y>>1)); n=$((n+1)); done
    if [ $n -le 7 ]; then       # 7
        y=$x
    elif [ $n -le 11 ]; then    # 5+6
        y=" $(( ((x>> 6)&0x1F)+0xC0 )) \
            $(( (x&0x3F)+0x80 ))" 
    elif [ $n -le 16 ]; then    # 4+6+6
        y=" $(( ((x>>12)&0x0F)+0xE0 )) \
            $(( ((x>> 6)&0x3F)+0x80 )) \
            $(( (x&0x3F)+0x80 ))"
    else                        # 3+6+6+6
        y=" $(( ((x>>18)&0x07)+0xF0 )) \
            $(( ((x>>12)&0x3F)+0x80 )) \
            $(( ((x>> 6)&0x3F)+0x80 )) \
            $(( (x&0x3F)+0x80 ))"
    fi
    printf -v y '\\x%x' $y
    echo -n -e $y
}

# test
for (( i=0x2500; i<0x2600; i++ )); do
    UnicodePointToUtf8 $i
    [ "$(( i+1 & 0x1f ))" != 0 ] || echo ""
done
x='U+2620'
echo "$x -> $(UnicodePointToUtf8 $x)"

আউটপুট:

─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟
┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿
╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟
╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿
◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟
◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿
U+2620 -> 

0

যদি ইউনিকোড চরিত্রের হেক্স মানটি জানা যায়

H="2620"
printf "%b" "\u$H"

যদি একটি ইউনিকোড অক্ষরের দশমিক মান জানা যায়

declare -i U=2*4096+6*256+2*16
printf -vH "%x" $U              # convert to hex
printf "%b" "\u$H"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.