বাশে বিভিন্ন কোড পয়েন্ট দ্বারা আমি কীভাবে একটি এএসসিআইআই অক্ষর মুদ্রণ করব?


12

এএসসিআইআই টেবিলটিতে 'জে' অক্ষর উপস্থিত রয়েছে যার বিভিন্ন সংখ্যা সিস্টেমে কোড পয়েন্ট রয়েছে:

Oct   Dec   Hex   Char
112   74    4A    J

এই অক্ষরে মুদ্রণ দ্বারা printf '\112'বা অষ্টাল কোড পয়েন্ট দ্বারা মুদ্রণ করা সম্ভব echo $'\112'। দশমিক এবং হেক্সাডেসিমাল কোড পয়েন্ট উপস্থাপনা দ্বারা আমি একই অক্ষরটি কীভাবে মুদ্রণ করব?


উত্তর:



6

সহ zsh:

$ printf '\x4a\n' # Hex
J
$ printf "\\$(([##8]74))\n" # Dec
J

ইউনিকোড কোড পয়েন্ট থেকে একটি অক্ষর (বর্তমান চরসেটে) পেতে:

$ printf '\U1F42E\n' # Hex
🐮
$ printf "\\U$(([##16]128046))\n" # Dec
🐮

এছাড়াও দয়া করে উত্তর দিন দ্বারা 'f0 9f 90 AE' হেক্স কোড এই মুখ প্রিন্ট করতে কিভাবে
viavad


6

সাধারণভাবে, শেলটি ভেরিয়েবলগুলিতে হেক্স, অক্ট এবং দশমিক সংখ্যা বুঝতে পারে, তবে তাদের সংজ্ঞা দেওয়া হয়েছে integers:

$ declare -i v1 v2 v3 v4 v5 v6 v7
$ v1=0112
$ v2=74
$ v3=0x4a
$ v4=8#112
$ v5=10#74
$ v6=16#4a
$ v7=18#gg
echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304

বা এগুলি একটি "গাণিতিক সম্প্রসারণ" এর ফলাফল:

$ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg ))
$ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7"
74 74 74 74 74 74 304

সুতরাং, আপনার একটি পরিবর্তনশীল মানের সাথে সম্পর্কিত চরিত্রটি মুদ্রণের জন্য একটি উপায় প্রয়োজন।
তবে এখানে দুটি সম্ভাব্য উপায় রয়েছে:

$ var=$((0x65))
$ printf '%b\n' "\\$(printf '0%o' "$var")"
e

$ declare -i var
$ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")"
e

দুটি প্রিন্টফের প্রয়োজন, একটি হেক্সাডেসিমাল স্ট্রিংয়ে মান রূপান্তর করতে এবং দ্বিতীয়টি প্রকৃতপক্ষে অক্ষরটি মুদ্রণের জন্য।

দ্বিতীয়টি কোনও ইউনিকোড পয়েন্ট মুদ্রণ করবে (যদি আপনার কনসোলটি সঠিকভাবে সেট করা থাকে)।
উদাহরণ স্বরূপ:

$ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")"

একজন তুষার মানুষ।

যে চরিত্রটির যেমন utt-8 উপস্থাপনা f0 9f 90 aeরয়েছে 0x1F42E। জন্য অনুসন্ধান করুন cow face site:fileformat.infoথেকে এটি পেতে :

$ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")"
🐮

দ্রষ্টব্য : ইউনিকোডে 4..৩ এর আগে ব্যাশের জন্য সমস্যা রয়েছে (সেই সংস্করণে এবং উপরের দিকে সংশোধন করা হয়েছে), ইউনিকোডির পয়েন্ট 128 এবং 255 (দশমিক ক্ষেত্রে) এর মধ্যে অক্ষরগুলি ভুলভাবে মুদ্রিত হতে পারে।


তথ্যসূত্র

চতুর্থ অনুচ্ছেদ ভিতরে PARAMETERSমধ্যে man bash:

যদি ভেরিয়েবলটির পূর্ণসংখ্যা বৈশিষ্ট্য সেট থাকে, তবে $ ((...)) সম্প্রসারণ ব্যবহার না করা হলেও (নীচে পাটিগণিত সম্প্রসারণ দেখুন) গণিতের এক্সপ্রেশন হিসাবে মানটি মূল্যায়ন করা হয়।

এর মধ্যে "শিল্প মূল্যায়ন" এর ভিতরে man bash:

শীর্ষস্থানীয় 0 সহ ধ্রুবকগুলি অষ্টাল সংখ্যা হিসাবে ব্যাখ্যা করা হয়। একটি শীর্ষস্থানীয় 0x বা 0 এক্স হেক্সাডেসিমালকে বোঝায়। অন্যথায়, সংখ্যাগুলি [বেস #] এন রূপ নেয়, যেখানে alচ্ছিক বেসটি পাটিগণিত বেসকে উপস্থাপন করে 2 এবং 64 এর মধ্যে দশমিক সংখ্যা, এবং n সেই বেসের একটি সংখ্যা। যদি বেস # বাদ দেওয়া হয় তবে বেস 10 ব্যবহার করা হয়। 9 টির চেয়ে বড় অঙ্কগুলি সেই ক্রমে ছোট হাতের অক্ষর, বড় হাতের অক্ষর, @, এবং _ দ্বারা প্রতিনিধিত্ব করা হয়। যদি বেসটি 36 এর চেয়ে কম বা তার সমান হয় তবে ছোট এবং বড় হাতের অক্ষরগুলি 10 এবং 35 এর মধ্যে সংখ্যার প্রতিনিধিত্ব করতে আন্তরচিকভাবে ব্যবহার করা যেতে পারে।


@ স্টাফেনচেজেলাস ওয়েল, একটি কোডপয়েন্টটি (সর্বদা) বাইট মান হয় না। বাশ (৪.৩ এর পূর্বে সংস্করণগুলিতে) কোড পয়েন্টের বাইট মান সরবরাহ করে। এটি: অক্ষর é(অক্টোবর: 351, ডিসেম্বর: 233, Hex: 0xE9) ভুলভাবে মুদ্রিত হয়েছে printf '\351'কারণ এটি 0xE9সর্বদা একটি বাইট মান প্রিন্ট করে । ISO-8859-1(এবং কাজিন) এর এনকোডিং সহ টার্মিনালের জন্য যা কাজ করতে পারে তবে utf-8 এনকোডেড টার্মিনালগুলিতে একটি বাইট মান 0xE9 হিসাবে প্রদর্শিত হবে নিয়ম ....
আইজাক

@ StéphaneChazelas আমি নোটিশ প্রথম না এক উদাহরণস্বরূপ "ব্যাশ 4.2 ভুল এনকোড" এর জন্য অনুসন্ধান করুন। এটি ব্যাশ ৪.৩ এবং উচ্চতর থেকে সংশোধন করা হয়েছে।
আইজাক

ঠিক আছে. আপনি এখন কী বোঝাতে চেয়েছেন তা আমি দেখতে পেয়েছি (আমি আপনার উত্তরের পূর্ববর্তী সংস্করণ অনুযায়ী 4.3 দিয়ে পরীক্ষা করছি)। মনে রাখবেন এটি কেবল বাশ \u-২.২, বশ -২.১ সমর্থন করে না (যা zsh থেকে আসে)।
স্টাফেন চেজেলাস



0

কনভার্ট করার জন্য যদি আপনার কাছে সংখ্যার একটি তালিকা থাকে এবং আপনি কোনও ফাংশন কল এড়াতে এবং প্রতিটি চরিত্রের জন্য একটি সাবশেল তৈরি করতে চান, আপনি আগে থেকেই আসকি সেটটি সংজ্ঞায়িত করতে পারেন:

ascii=$(for x in {0..9} {A..F}; do for y in {0..9} {A..F}; do echo -ne "\x$x$y"; done; done)

নোট চরটি বাদ দেওয়া হয়েছে তা নোট করুন, তাই প্রতিটি চর 1 দ্বারা অফসেট হয়।

তারপরে এই জাতীয় কিছু ব্যবহার করুন (প্রতি লাইনে 1 নম্বর ধরে):

while read c; do out+="${ascii:$c-1:1}"; done <<< "$in"
echo "$out"

0

এখানে সমস্ত রূপান্তর ব্যবহার করে printf:

printf "%o" "'J" # 112 (oct)
printf "%d" "'J" # 74 (dec)
printf "%x" "'J" # 4a (hex)

printf '\112' # J (oct)
printf "\x$(printf %x 74)" # J (dec, requires double conversion)
printf '\x4a' # J (hex)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.