ট্র্যাক
/
Julia
Julia
/
সিলেবাস
/
ক্যারেক্টার
ক্

ক্যারেক্টার মধ্যে Julia

4টি অনুশীলনী

ক্যারেক্টার সম্পর্কে

এটি একটি বিশাল বিষয়! এটি নিয়ে একটি দীর্ঘ বই লেখা সম্ভব, এবং বেশ কয়েকজন তা করেছেনও (কয়েকটি উদাহরণ দেখতে Amazon-এ "unicode book" লিখে খুঁজুন)।

এক অতি সংক্ষিপ্ত ইতিহাস

আগের দশকগুলোতে কম্পিউটারে ক্যারেক্টার নিয়ে কাজ করা অনেক সহজ ছিল, যখন প্রোগ্রামাররা ধরে নিতেন ইংরেজিই একমাত্র গুরুত্বপূর্ণ ভাষা। তাহলে হিসাবটি ছিল এ রকম: ২৬টি অক্ষর, বড় ও ছোট হাতের, ১০টি সংখ্যা, কয়েকটি যতিচিহ্ন, সঙ্গে বেল বাজানোর একটি কোড (0x07), আর এই সব মিলে ধরে যেত ৭ বিটে: ASCII ক্যারেক্টার সেট।

স্বাভাবিকভাবেই, মানুষ প্রশ্ন করতে শুরু করল à, ä আর Ł নিয়ে, তারপর অন্যরা প্রশ্ন তুলল ऄ, ஹ আর ญ নিয়ে, আর তরুণেরা চাইল ইমোজি 😱। এখন কী করা যায়?

সংক্ষেপে বলতে গেলে, অনেক বুদ্ধিমান ও ধৈর্যশীল মানুষকে বছরের পর বছর কমিটিতে বসে Unicode ক্যারেক্টার সেট এবং UTF-8-এর মতো এনকোডিংয়ের খুঁটিনাটি ঠিক করতে হয়েছিল, আর অনেক সফটওয়্যারকে খুবই জটিলভাবে নতুন করে লিখতে হয়েছিল। এছাড়া অনেক নতুন বাগও ঢুকে পড়ল।

সবকিছু যাতে ভেঙে না পড়ে, সেজন্য Unicode/UTF-8 নকশা নিশ্চিত করে যে প্রথম ১২৭টি কোড ASCII-এর সঙ্গে হুবহু এক (এমনকি বেলটিও)।

Julia-তে ক্যারেক্টার

২০০৫ সালের পর নকশা করা ভাষাগুলোর বড় সুবিধা হলো, তখন মোটামুটি স্থিতিশীল একটি Unicode স্ট্যান্ডার্ড আগেই তৈরি হয়ে গিয়েছিল।

Julia (প্রথম প্রকাশ ২০১২ সালে) ধরে নিতে পেরেছিল যে সবকিছুই Unicode হবে: ক্যারেক্টার, স্ট্রিং, ভ্যারিয়েবল ও ফাংশনের নাম, গাণিতিক অপারেটর...

ম্যানুয়াল-এ বলা হয়েছে, "Julia makes dealing with plain ASCII text simple and efficient, and handling Unicode is as simple and efficient as possible." "যতটা সম্ভব" কথাটি লক্ষ্য করুন, বক্তব্যের এই অংশটি গুরুত্বপূর্ণ।

ক্যারেক্টার লিটারাল লেখা হয় একক উদ্ধৃতি চিহ্নে, আর তা দ্বৈত উদ্ধৃতি চিহ্নে লেখা স্ট্রিং থেকে আলাদা।

C/C++ জগতের মানুষের কাছে এটি স্পষ্ট, কিন্তু Python আর Javascript প্রোগ্রামারদের জন্য বিভ্রান্তিকর হতে পারে।

julia> a = 'a'  # Roman alphabet
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

julia> typeof(a)
Char

julia> jha = 'झ'  # Devanagari alphabet
'झ': Unicode U+091D (category Lo: Letter, other)

julia> typeof(jha)
Char


julia> '❤'  # heart emoji
'❤': Unicode U+2764 (category So: Symbol, other)

উদাহরণগুলো থেকে দেখা যায় টাইপটি Char, আর Julia-র কাছে ক্যারেক্টারের ক্যাটাগরি সম্পর্কে আরও তথ্য থাকে।

একটু খেয়াল করলে দেখা যায়, এই ক্যারেক্টারগুলোকে ৪টি হেক্সাডেসিমাল ডিজিট দিয়ে প্রকাশ করা যায়। পুরো ক্যারেক্টার সেটের জন্য সর্বোচ্চ ৬টি হেক্স ডিজিট লাগে।

এই সংখ্যাগুলোকে বলা হয় "কোড পয়েন্ট", আর বর্তমানে এগুলো U+0000 থেকে U+10FFFF পর্যন্ত বিস্তৃত। REPL-এ এগুলো দেখা যায়, তবে কোডের ভেতরে এগুলো পেতে codepoints() ব্যবহার করুন।

Char আর Int-এর মধ্যে রূপান্তর করা সহজ:

julia> Int('a')
97

julia> Char(97)
'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)

কম্পাইলার Char-এর উপর কিছু ধরনের ইন্টিজার অ্যারিথমেটিক অনুমোদন করে:

julia> 'b' - 'a'  # interval, in alphabetic order
1

julia> 'b' + 'a'
ERROR: MethodError: no method matching +(::Char, ::Char)

julia> 'a' + 5
'f': ASCII/Unicode U+0066 (category Ll: Letter, lowercase)

julia> 'f' + ('A' - 'a')  # same as `uppercase('f')`
'F': ASCII/Unicode U+0046 (category Lu: Letter, uppercase)

ক্যারেক্টারের জন্য ফাংশন

স্ট্রিং নিয়ে কাজ করা ফাংশনগুলোর একটি উপসেট Char ইনপুটেও কাজ করতে পারে।

  • উপযুক্ত বর্ণমালার ক্ষেত্রে, uppercase() ও lowercase() দিয়ে হাতের বড়-ছোট পরিবর্তন করুন।
  • isuppercase() ও islowercase() দিয়ে হাতের বড়-ছোট যাচাই করুন।
  • ক্যারেক্টারের ধরন যাচাই করুন এগুলো দিয়ে:
    • isletter(), অনেক বর্ণমালা কভার করে
    • isdigit(), কঠোরভাবে 0:9 যাচাই করে
    • isnumeric(), isdigit-এর চেয়ে ব্যাপক, তাই ¾ আর ইউরোপীয় নয় এমন নানা লিপির জন্য true
    • isxdigit(), হেক্সাডেসিমাল ডিজিট
    • isascii(), Unicode-পূর্ব ক্যারেক্টার
    • ispunct(), যতিচিহ্ন
    • isspace(), যেকোনো হোয়াইটস্পেস ক্যারেক্টার
    • isprint(), প্রিন্টযোগ্য ক্যারেক্টার (বিপরীতটি iscntrl())
islowercase('A')  # false
uppercase('γ')  # 'Γ': Unicode U+0393 (category Lu: Letter, uppercase)
ispunct('@')  # true
isdigit('A')  # false
isxdigit('A')  # true

একটি স্ট্রিং-এ কোনো ক্যারেক্টার আছে কি না তা যাচাই করতে আছে in। লক্ষ্য করুন, এটি সাবস্ট্রিং থেকে আলাদা:

# char search
julia> 'a' ∈ "xabcahliazlnkiw"
true

# substring search
julia> "a" ∈ "xabcahliazlnkiw"
use occursin(needle, haystack) for string containment

এছাড়া রেগুলার এক্সপ্রেশন (আরেকটি কনসেপ্টের বিষয়) শক্তিশালী সার্চ ও কারসাজির সুযোগ দেয়।

ক্যারেক্টার ভেক্টর ও স্ট্রিং-এর পারস্পরিক রূপান্তর

স্ট্রিং থেকে ক্যারেক্টার ভেক্টরে যেতে collect() ব্যবহার করা যায়।

ক্যারেক্টার ভেক্টর থেকে স্ট্রিং-এ যেতে আছে String() কনস্ট্রাক্টর।

julia> s = "abcde"
"abcde"

julia> cv = collect(s)
5-element Vector{Char}:
 'a': ASCII/Unicode U+0061 (category Ll: Letter, lowercase)
 'b': ASCII/Unicode U+0062 (category Ll: Letter, lowercase)
 'c': ASCII/Unicode U+0063 (category Ll: Letter, lowercase)
 'd': ASCII/Unicode U+0064 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)

julia> String(cv)
"abcde"

এটি শুধু ASCII নয়, যেকোনো ক্যারেক্টারের সঙ্গে কাজ করে।

julia> collect("❤,😱")
3-element Vector{Char}:
 '❤': Unicode U+2764 (category So: Symbol, other)
 ',': ASCII/Unicode U+002C (category Po: Punctuation, other)
 '😱': Unicode U+1F631 (category So: Symbol, other)

লক্ষ্য করুন, String() কনস্ট্রাক্টরটি কাজ করে একটি ভেক্টরের উপর। একটি একক Char-কে ১ ক্যারেক্টারের স্ট্রিং-এ কাস্ট করতে যে ফাংশনটি লাগে তা string(), ছোট হাতের s দিয়ে।

julia> string('a')
"a"

স্টোরেজ

এতক্ষণ পর্যন্ত এই লেখায় সবকিছুই মোটামুটি সহজ মনে হচ্ছে, তাহলে কি সত্যিই চিন্তার কিছু নেই?

দুর্ভাগ্যবশত, এটি খুবই আশাবাদী ধারণা!

একটি জটিলতা আসে প্রতি কোড পয়েন্টের জন্য "সর্বোচ্চ" ৬টি হেক্স ডিজিটের দরকার থেকে। তার মানে, UTF-8-এ এনকোড করা হলে ভিন্ন ভিন্ন ক্যারেক্টারের জন্য মেমরিতে ভিন্ন পরিমাণ জায়গা লাগে।

একটি বাইট (আনসাইনড) সংখ্যা রাখতে পারে সর্বোচ্চ ২৫৫ পর্যন্ত, অর্থাৎ দুই হেক্স ডিজিট, তাই UTF-8 একটি Char রাখতে পরিবর্তনশীল সংখ্যক বাইট (১ থেকে ৪) ব্যবহার করে। এগুলোকে বলা হয় "কোড ইউনিট", আর ncodeunits() ফাংশনটি কোনো নির্দিষ্ট ক্যারেক্টারের জন্য প্রয়োজনীয় সংখ্যাটি রিটার্ন করে।

julia> codepoint(jha)  # jha 'झ' is defined in an earlier example
0x0000091d

julia> ncodeunits(jha)
3

julia> ncodeunits('a')  # ASCII character
1

julia> ncodeunits('😱')  # emoji
4

এছাড়া স্ক্রিনে যেসব জিনিস দেখানো যায়, তাদের সবার নিজস্ব আলাদা কোড পয়েন্ট থাকে না। কিছু দেখতে আলাদা ক্যারেক্টারকে অন্যগুলো থেকে উদ্ভূত বলে ধরা হয়, তাই Unicode সেগুলোকে একটি মূল ক্যারেক্টার আর একটি মডিফায়ার হিসেবে গণ্য করে।

GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি নতুন একটি উইন্ডো বা ট্যাবে খুলবে

ক্যারেক্টার শিখুন

অনুশীলন লক করা আছে

ক্যারেক্টার অনুশীলন করতে আরও 3টি অনুশীলনী আনলক করুন