$ locale charmap
UTF-8
আমার বর্তমান পরিবেশে, অক্ষর সেটটি ইউটিএফ -8, অর্থাৎ অক্ষরগুলি প্রতিটি চরিত্রের জন্য 1 থেকে 4 বাইট সহ এনকোড থাকে (যদিও ইউটিএফ -8 অনুমোদিত অক্ষর কোডের 0x7fffffff পর্যন্ত পয়েন্ট দেয়, বেশিরভাগ সরঞ্জামগুলি ইউটিএফ- 6 বাইট পর্যন্ত 8 বাইট সিকোয়েন্স)।
সেই অক্ষর সেটটিতে, ইউনিকোড থেকে সমস্ত অক্ষর পাওয়া যায়, একটি a
বাইট মান 65 হিসাবে কোডেড হয়, একটি 乕
3 বাইট 228 185 149 এবং é
উদাহরণস্বরূপ দুটি বাইট অনুক্রম 195 169 হিসাবে as
$ printf 乕 | wc -mc
1 3
$ printf a | wc -mc
1 1
এখন:
$ export fr_FR.iso885915@euro
$ locale charmap
ISO-8859-15
আমি আমার পরিবেশটি পরিবর্তন করেছি, যেখানে অক্ষর সেটটি এখন আইএসও -8859-15 (ভাষা, মুদ্রার প্রতীক, তারিখের ফর্ম্যাটের মতো অন্যান্য জিনিসও সংশোধন করা হয়েছে, সেই অঞ্চলগুলির সেটিংগুলির সংগ্রহটি স্থানীয় হিসাবে উল্লেখ করা হয়েছে )। নতুন পরিবেশে এর চরিত্রটি রেন্ডারিংয়ের সাথে খাপ খাইয়ে নেওয়ার জন্য আমাকে সেই পরিবেশে একটি নতুন টার্মিনাল এমুলেটর শুরু করতে হবে।
আইএসও -8859-15 একটি একক বাইট অক্ষর সেট যার অর্থ এটিতে কেবল 256 টি অক্ষর রয়েছে (আসলে এটির তুলনায় আসলে আরও কম) coveredাকা রয়েছে। সেই নির্দিষ্ট চরিত্র সেটটি পশ্চিম ইউরোপের ভাষার জন্য ব্যবহৃত হয় কারণ এটি এর বেশিরভাগ ভাষা (এবং ইউরো প্রতীক) coversেকে রাখে।
এটি a
ইউটিএফ -8 বা এএসসিআইআই-র মতো বাইট মান 65 এর é
সাথে অক্ষরযুক্ত রয়েছে, এতে অক্ষরটিও রয়েছে (উদাহরণস্বরূপ ফরাসী বা স্প্যানিশ ভাষায় সাধারণত ব্যবহৃত হয়) তবে বাইট মান 233 সহ, এতে 乕 অক্ষর নেই।
যে পরিবেশে, wc -c
এবং wc -m
সর্বদা একই ফলাফল দেবে।
বেশিরভাগ আধুনিক ইউনিক্স-মতো সিস্টেমে উবুন্টুতে, ডিফল্টটি সাধারণত ইউটিএফ -8 হয় কারণ এটি একমাত্র সমর্থিত অক্ষর সেট (এবং এনকোডিং) যা পুরো ইউনিকোড পরিসীমা জুড়ে।
অন্যান্য বহু-বাইট চরিত্রের এনকোডিংগুলি বিদ্যমান, তবে উবুন্টুতে সেগুলি যথাযথভাবে সমর্থিত নয় এবং আপনাকে সেগুলির সাথে একটি লোকেল তৈরি করতে সক্ষম হতে হুপসের মধ্য দিয়ে যেতে হবে এবং যদি আপনি এটি করেন তবে আপনি দেখতে পাবেন যে অনেক কিছুই না যথাযথভাবে কাজ কর.
উবুন্টুতে কার্যকরভাবে, অক্ষর সেটগুলি হয় একক-বাইট, বা ইউটিএফ -8।
এখন, আরও কয়েকটি নোট:
ইউটিএফ -8 এ, সমস্ত বাইট সিকোয়েন্সগুলি বৈধ অক্ষর তৈরি করে না। উদাহরণস্বরূপ, সমস্ত ইউটিএফ -8 অক্ষর যা ASCII নয় তা বাইট দ্বারা গঠিত হয় যেগুলির মধ্যে 8 তম বিট সেট রয়েছে, তবে যেখানে কেবল প্রথমটিতে 7 তম বিট সেট রয়েছে।
আপনার যদি 8 তম বিট সেট সহ বাইটগুলির ক্রম থাকে, যার কোনওটিতে 7 তম বিট সেট নেই, তবে এটি কোনও অক্ষরে অনুবাদ করা যায় না। এবং যখন আপনি সমস্যা এবং অসঙ্গতিগুলি শুরু করছেন তখন সফ্টওয়্যারগুলির সাথে কী করা উচিত তা জানে না। এই ক্ষেত্রে:
$ printf '\200\200\200' | wc -mc
0 3
$ printf '\200\200\200' | grep -q . || echo no
no
wc
এবং grep
সেখানে কোনও চরিত্র খুঁজে পাও না:
$ x=$'\200\200\200' bash -c 'echo "${#x}"'
3
bash
৩. এটি যখন কোনও চরিত্রের বাইটের ক্রম মানচিত্র করতে পারে না, তখন এটি প্রতিটি বাইটকে একটি চরিত্র হিসাবে বিবেচনা করে।
এটি এমনকি আরও অনেক কিছুর মত সেখানে ইউনিকোড মধ্যে codepoints যে অক্ষর হিসাবে অবৈধ হয় আরো জটিল হতে পারে, এবং কিছু যে হয় অ অক্ষর , এবং টুল উপর নির্ভর করে, তাদের UTF-8 এনকোডিং বা একটি অক্ষর হিসেবে গণ্য হতে পারে না।
আরেকটি বিষয় বিবেচনায় রাখা হ'ল চরিত্র এবং গ্রাফেমের পার্থক্য এবং কীভাবে সেগুলি রেন্ডার করা হয় is
$ printf 'e\u301\u20dd\n'
é⃝
$ printf 'e\u301\u20dd' | wc -mc
3 6
সেখানে আমরা একটি গ্রাফেম হিসাবে রেন্ডার করা 6 বাইট হিসাবে 3 অক্ষর কোড করেছি, কারণ আমরা একসাথে 3 টি অক্ষর পেয়েছি (একটি বেস অক্ষর, একটি সংমিশ্রণ তীব্র উচ্চারণ এবং একটি সংমিশ্রণ ঘের)।
wc
উবুন্টুতে পাওয়া জিএনইউ বাস্তবায়নের ইনপুটটিতে -L
আপনাকে প্রশস্ত রেখার প্রস্থের প্রস্থটি জানাতে একটি সুইচ রয়েছে :
$ printf 'e\u301\u20dd\n' | wc -L
1
আপনি আরও দেখতে পাবেন যে কিছু অক্ষর উপরের থেকে আমাদের অক্ষরের মতো প্রস্থের গণনায় 2 টি কোষ দখল করে 乕
:
$ echo 乕 | wc -L
2
উপসংহারে: ওয়াইল্ডার শব্দের মধ্যে বাইট, চরিত্র এবং গ্রাফেম অগত্যা এক নয়।