আমি শুনেছি এবং শুনেছি যে সি ++ 11 ইউনিকোড সমর্থন করে। সে সম্পর্কে কয়েকটি প্রশ্ন:
- সি ++ স্ট্যান্ডার্ড লাইব্রেরি ইউনিকোডকে কতটা সমর্থন করে?
std::string
এটি করা উচিত কি না?- আমি কিভাবে এটা ব্যবহার করব?
- সম্ভাব্য সমস্যাগুলি কোথায়?
আমি শুনেছি এবং শুনেছি যে সি ++ 11 ইউনিকোড সমর্থন করে। সে সম্পর্কে কয়েকটি প্রশ্ন:
std::string
এটি করা উচিত কি না?উত্তর:
সি ++ স্ট্যান্ডার্ড লাইব্রেরি ইউনিকোডকে কতটা ভাল সমর্থন করে?
ভয়ঙ্কর।
ইউনিকোড সমর্থন সরবরাহ করতে পারে এমন লাইব্রেরি সুবিধাগুলির মাধ্যমে একটি দ্রুত স্ক্যান আমাকে এই তালিকাটি দেয়:
আমি মনে করি প্রথমটি বাদে সবগুলিই ভয়ানক সমর্থন সরবরাহ করে। আপনার অন্যান্য প্রশ্নের মাধ্যমে দ্রুত ঘুরে দেখার পরে আমি আরও বিশদে এটিতে ফিরে আসব।
std::string
এটি করা উচিত কি না?
হ্যাঁ. সি ++ স্ট্যান্ডার্ড অনুসারে, এটি std::string
এবং এর ভাইবোনদের কি করা উচিত:
শ্রেণীর টেম্পলেটটি
basic_string
এমন বস্তুগুলিকে বর্ণনা করে যা শূন্যের পজিশনের প্রথম উপাদানটির সাথে বিবিধ সংখ্যক স্বেচ্ছাসেবী চর-জাতীয় বস্তু সমন্বিত একটি ক্রম সংরক্ষণ করতে পারে।
ঠিক আছে, std::string
এটা ঠিক আছে। এটি কি কোনও ইউনিকোড-নির্দিষ্ট কার্যকারিতা সরবরাহ করে? না।
ইহা উচিত? সম্ভবত না. অবজেক্টের std::string
ক্রম হিসাবে ঠিক আছে char
। এটি দরকারী; একমাত্র বিরক্তি হ'ল এটি পাঠ্যের খুব নিম্ন-স্তরের মতামত এবং স্ট্যান্ডার্ড সি ++ একটি উচ্চ স্তরের কোনও সরবরাহ করে না।
আমি কিভাবে এটা ব্যবহার করব?
এটি char
বস্তুর ক্রম হিসাবে ব্যবহার করুন ; এটি ভান করে অন্য কিছু ব্যথা শেষ হতে বাধ্য।
সম্ভাব্য সমস্যাগুলি কোথায়?
সব জায়গায় বেশি? দেখা যাক...
স্ট্রিংস লাইব্রেরি
স্ট্রিং লাইব্রেরি আমাদের সরবরাহ করে basic_string
, যা কেবলমাত্র স্ট্যান্ডার্ডকে "চর-জাতীয় বস্তু" বলে ডাকে তার ক্রম। আমি তাদের কোড ইউনিট বলি। আপনি যদি পাঠ্যের একটি উচ্চ-স্তরের দৃষ্টিভঙ্গি চান তবে এটি আপনি যা খুঁজছেন তা নয়। এটি সিরিয়ালাইজেশন / ডিসরিয়ালাইজেশন / স্টোরেজ জন্য উপযুক্ত পাঠ্যের একটি দর্শন।
এটি সি লাইব্রেরি থেকে কিছু সরঞ্জাম সরবরাহ করে যা সংকীর্ণ বিশ্ব এবং ইউনিকোড বিশ্বের মধ্যে ব্যবধানটি সরাতে ব্যবহৃত হতে পারে: c16rtomb
/ mbrtoc16
এবং c32rtomb
/ mbrtoc32
।
স্থানীয়করণ গ্রন্থাগার
স্থানীয়করণ গ্রন্থাগার এখনও বিশ্বাস করে যে এই "চর-সদৃশ বস্তুগুলির মধ্যে একটির" "চরিত্র" সমান। এটি অবশ্যই নির্বোধ এবং এএসসিআইআই এর মতো ইউনিকোডের কিছু ছোট উপসেটের বাইরেও প্রচুর জিনিস সঠিকভাবে কাজ করা অসম্ভব করে তোলে।
উদাহরণস্বরূপ, শিরোনামটিতে স্ট্যান্ডার্ডটি "সুবিধাযুক্ত ইন্টারফেসগুলি" কী বলে বিবেচনা করুন <locale>
:
template <class charT> bool isspace (charT c, const locale& loc);
template <class charT> bool isprint (charT c, const locale& loc);
template <class charT> bool iscntrl (charT c, const locale& loc);
// ...
template <class charT> charT toupper(charT c, const locale& loc);
template <class charT> charT tolower(charT c, const locale& loc);
// ...
আপনি কীভাবে এই ফাংশনগুলির কোনওটির যথাযথভাবে শ্রেণিবদ্ধকরণ করবেন বলে বলুন, U + 1F34C?, হিসাবে u8"🍌"
বা হিসাবে আছে u8"\U0001F34C"
? এটি কখনও কাজ করার উপায় নেই, কারণ এই ফাংশনগুলি ইনপুট হিসাবে কেবল একটি কোড ইউনিট নেয়।
আপনি যদি char32_t
কেবলমাত্র ব্যবহার করেন তবে এটি উপযুক্ত লোকেলের সাথে কাজ করতে পারে : U'\U0001F34C'
ইউটিএফ -32-এ একটি একক কোড ইউনিট।
যাইহোক, এর অর্থ এখনও আপনি কেবল সহজ কেসিং রূপান্তরগুলি পেয়ে যান toupper
এবং tolower
উদাহরণস্বরূপ, কিছু জার্মান লোকালগুলির পক্ষে এটি যথেষ্ট ভাল নয়: "SS" বড় হাতের অক্ষরগুলি "এসএস" ☦ তবে toupper
কেবল একটি অক্ষর কোড ইউনিট ফিরিয়ে দিতে পারে ।
পরবর্তী, wstring_convert
/ wbuffer_convert
এবং স্ট্যান্ডার্ড কোড রূপান্তর দিকগুলি।
wstring_convert
একটি প্রদত্ত এনকোডিংকে অন্য প্রদত্ত এনকোডিংয়ের স্ট্রিংয়ের মধ্যে রূপান্তর করতে ব্যবহৃত হয়। এই রূপান্তরটির সাথে দুটি স্ট্রিং প্রকার জড়িত রয়েছে, যা মানককে বাইট স্ট্রিং এবং প্রশস্ত স্ট্রিং বলে। যেহেতু এই পদগুলি সত্যই বিভ্রান্তিকর, তাই আমি যথাক্রমে † এর পরিবর্তে যথাক্রমে "সিরিয়ালাইজড" এবং "ডিসরিয়ালাইজড" ব্যবহার করতে পছন্দ করি †
এর মধ্যে রূপান্তর করার জন্য এনকোডিংগুলি কোনও কোডেকট (কোনও কোড রূপান্তর ফ্যাক্ট) দ্বারা টেমপ্লেট টাইপের আর্গুমেন্ট হিসাবে পাস করার সিদ্ধান্ত নিয়েছে wstring_convert
।
wbuffer_convert
একটি অনুরূপ ফাংশন সম্পাদন করে তবে একটি বিস্তৃত ডিসরিয়ালাইজড স্ট্রিম বাফার হিসাবে যা বাইট সিরিয়ালাইজড স্ট্রিম বাফারে আবৃত করে। কোডেকভেট আর্গুমেন্টের দ্বারা প্রদত্ত এনকোডিংগুলিতে এবং রূপান্তরকৃত অন্তর্নিহিত বাইট সিরিয়ালাইজড স্ট্রিম বাফারের মাধ্যমে যে কোনও আই / ও করা হয় । সেই বাফারে সিরিয়ালাইজ লেখা, এবং তারপরে সেগুলি লিখুন, এবং পড়াটি বাফারে পড়ে এবং তারপরে এটি ডিসরিয়ালাইজ হয়।
মান এই সুবিধা সাথে ব্যবহারের জন্য কিছু codecvt বর্গ টেমপ্লেট প্রদান করে: codecvt_utf8
, codecvt_utf16
, codecvt_utf8_utf16
, এবং কিছু codecvt
বিশেষায়িত। একসাথে এই স্ট্যান্ডার্ড দিকগুলি নিম্নলিখিত সমস্ত রূপান্তর সরবরাহ করে। (দ্রষ্টব্য: নীচের তালিকায়, বামে এনকোডিংটি সর্বদা সিরিয়ালযুক্ত স্ট্রিং / স্ট্র্যামবুফ থাকে এবং ডানদিকে থাকা এনকোডিংটি সর্বদা ডিসরিয়ালাইজড স্ট্রিং / স্ট্র্যামবুফ থাকে; স্ট্যান্ডার্ডটি উভয় দিকে রূপান্তর করতে দেয়)।
codecvt_utf8<char16_t>
, এবং codecvt_utf8<wchar_t>
কোথায় sizeof(wchar_t) == 2
;codecvt_utf8<char32_t>
, codecvt<char32_t, char, mbstate_t>
এবং codecvt_utf8<wchar_t>
যেখানে sizeof(wchar_t) == 4
;codecvt_utf16<char16_t>
এবং codecvt_utf16<wchar_t>
যেখানে ইউসিএস -2 sizeof(wchar_t) == 2
;codecvt_utf16<char32_t>
এবং codecvt_utf16<wchar_t>
কোথায় sizeof(wchar_t) == 4
;codecvt_utf8_utf16<char16_t>
, codecvt<char16_t, char, mbstate_t>
এবং codecvt_utf8_utf16<wchar_t>
যেখানে sizeof(wchar_t) == 2
;codecvt<wchar_t, char_t, mbstate_t>
codecvt<char, char, mbstate_t>
।এর মধ্যে বেশ কয়েকটি দরকারী, তবে এখানে প্রচুর বিশ্রী জিনিস রয়েছে।
প্রথমে high পবিত্র হাই সার্গেট! নামকরণ প্রকল্পটি অগোছালো।
তারপরে, অনেকগুলি ইউসিএস -2 সমর্থন রয়েছে। ইউসিএস -২ হ'ল ইউনিকোড ০.০ এর একটি এনকোডিং যা ১৯৯ 1996 সালে ছাড়ানো হয়েছিল কারণ এটি কেবলমাত্র বেসিক বহুভাষিক বিমানটিকে সমর্থন করে। কেন কমিটি 20 বছরেরও বেশি আগে যে এনকোডিংকে ছাড়িয়েছিল তা কেন মনোযোগী বলে বিবেচিত হয়েছিল, আমি জানি না ‡ এটি আরও এনকোডিংগুলির পক্ষে সমর্থন খারাপ বা কোনও কিছুর মতো নয়, তবে ইউসিএস -২ এখানে প্রায়শই দেখা যায়।
আমি বলব যে char16_t
এটি স্পষ্টতই ইউটিএফ -16 কোড ইউনিট সংরক্ষণ করার জন্য। তবে এটি স্ট্যান্ডার্ডের একটি অংশ যা অন্যথায় চিন্তা করে। codecvt_utf8<char16_t>
ইউটিএফ -16 এর সাথে কোনও সম্পর্ক নেই। উদাহরণস্বরূপ, wstring_convert<codecvt_utf8<char16_t>>().to_bytes(u"\U0001F34C")
জরিমানা সংকলন করবে, তবে নিঃশর্তে ব্যর্থ হবে: ইনপুটটিকে ইউসিএস -2 স্ট্রিং হিসাবে বিবেচনা করা হবে u"\xD83C\xDF4C"
, যা ইউটিএফ -8 এ রূপান্তর করা যায় না কারণ ইউটিএফ -8 0xD800-0xDFFF পরিসরের কোনও মান এনকোড করতে পারে না।
এখনও ইউসিএস -২ এর সম্মুখভাগে, কোনও ইউটিএফ -১ by বাইট স্ট্রিম থেকে এই দিকগুলি সহ কোনও ইউটিএফ -16 স্ট্রিংয়ে পড়ার উপায় নেই। আপনার যদি ইউটিএফ -16 বাইটের ক্রম থাকে তবে আপনি এটিকে স্ট্রিং-এ ডিজিট্রাইজ করতে পারবেন না char16_t
। এটি আশ্চর্যজনক, কারণ এটি কম-বেশি পরিচয় রূপান্তর। আরও আশ্চর্যজনক হলেও সত্য যে কোনও ইউটিএফ -16 স্ট্রিমের সাথে ইউসিএস -2 স্ট্রিংয়ের ডিসায়ালাইজিংয়ের সমর্থন রয়েছে codecvt_utf16<char16_t>
যা আসলে একটি ক্ষতিকারক রূপান্তর।
ইউটিএফ -16-হিসাবে-বাইটস সমর্থনটি বেশ ভাল, যদিও: এটি কোনও বিওএম থেকে অন্তর্নিহিততা সনাক্তকরণ, বা কোডে এটি স্পষ্টভাবে নির্বাচন করা সমর্থন করে। এটি বিওএম এর সাথে এবং তার বাইরেও আউটপুট উত্পাদন সমর্থন করে।
আরও কিছু আকর্ষণীয় রূপান্তর সম্ভাবনা অনুপস্থিত রয়েছে। কোনও ইউটিএফ -16 বাইট স্ট্রিম থেকে স্ট্রিং বা ইউটিএফ -8 স্ট্রিংয়ে ডিসরিয়াল করার কোনও উপায় নেই, যেহেতু ইউটিএফ -8 কখনই ডিসিরিয়ালাইজড ফর্ম হিসাবে সমর্থিত হয় না।
এবং এখানে সংকীর্ণ / প্রশস্ত বিশ্ব ইউটিএফ / ইউসিএস বিশ্ব থেকে সম্পূর্ণ পৃথক। পুরানো স্টাইলের সরু / প্রশস্ত এনকোডিং এবং কোনও ইউনিকোড এনকোডিংয়ের মধ্যে কোনও রূপান্তর নেই।
ইনপুট / আউটপুট লাইব্রেরি
আই / ও লাইব্রেরিটি ইউনিকোড এনকোডিংগুলিতে উপরে বর্ণিত সুবিধাগুলি wstring_convert
এবং পাঠ্যগুলি পড়তে এবং লিখতে ব্যবহার করা যেতে পারে wbuffer_convert
। আমি মনে করি না যে স্ট্যান্ডার্ড লাইব্রেরির এই অংশটির দ্বারা আরও অনেক কিছু সমর্থিত হওয়া দরকার।
নিয়মিত অভিব্যক্তি গ্রন্থাগার
আমি এর আগে স্ট্যাক ওভারফ্লোতে সি ++ রিজেক্সস এবং ইউনিকোডের সমস্যাগুলি ব্যাখ্যা করেছি । আমি এখানে এই সমস্ত পয়েন্ট পুনরাবৃত্তি করব না, তবে কেবল উল্লেখ করব যে সি ++ রেজিক্সগুলির স্তরের 1 ইউনিকোড সমর্থন নেই, যা সর্বত্র ইউটিএফ -32 ব্যবহার না করে এগুলি ব্যবহারযোগ্য করে তোলার জন্য সর্বনিম্নতম।
এটাই?
হ্যাঁ, এটা। এটি বিদ্যমান কার্যকারিতা। প্রচুর ইউনিকোড কার্যকারিতা রয়েছে যা সাধারণীকরণ বা পাঠ্য বিভাজন অ্যালগরিদমের মতো কোথাও দেখা যায় না।
U + 1F4A9 । সি ++ তে আরও ভাল কিছু ইউনিকোড সমর্থন পাওয়ার উপায় আছে কি?
সাধারণ সন্দেহভাজন: আইসিইউ এবং বুস্ট.লোকালে ।
By একটি বাইট স্ট্রিং, আশ্চর্যজনকভাবে, বাইটগুলির একটি স্ট্রিং, অর্থাৎ, char
অবজেক্টগুলি। তবে, প্রশস্ত স্ট্রিং আক্ষরিকের তুলনায় , যা সর্বদা wchar_t
অবজেক্টগুলির একটি অ্যারে, এই প্রসঙ্গে একটি "প্রশস্ত স্ট্রিং" অবশ্যই wchar_t
অবজেক্টগুলির একটি স্ট্রিং নয় । প্রকৃতপক্ষে, স্ট্যান্ডার্ডটি কখনই "প্রশস্ত স্ট্রিং" অর্থ কী তা স্পষ্টভাবে সংজ্ঞায়িত করে না, তাই আমরা ব্যবহার থেকে অর্থটি অনুমান করতে চলেছি। যেহেতু প্রমিত পরিভাষাটি opালু এবং বিভ্রান্তিকর, তাই আমি স্বচ্ছতার নামে নিজের ব্যবহার করি।
ইউটিএফ -16 এর মতো এনকোডিংগুলি সিকোয়েন্স হিসাবে সংরক্ষণ করা যেতে পারে char16_t
, যার পরে কোনও শেষ নেই; বা এগুলি বাইটের ক্রম হিসাবে সংরক্ষণ করা যেতে পারে, যার অন্তিমতা রয়েছে (প্রতিটি টানা জোড়া বাইট char16_t
এন্ডিয়নেসের উপর নির্ভর করে একটি আলাদা মান উপস্থাপন করতে পারে )। মান এই উভয় ফর্মকে সমর্থন করে। একটি ক্রম char16_t
প্রোগ্রাম অভ্যন্তরীণ কারসাজি জন্য আরও দরকারী। বাইটের একটি ক্রম হ'ল বাইরের বিশ্বের সাথে এই জাতীয় স্ট্রিং বিনিময় করার উপায়। "বাইট" এবং "প্রশস্ত" এর পরিবর্তে আমি যে পদগুলি ব্যবহার করব তা এইভাবে "সিরিয়ালাইজড" এবং "ডিসিরিয়ালাইজড" হয়।
You যদি আপনি "তবে উইন্ডোজ!" বলতে চলেছেন আপনার hold রাখা । উইন্ডোজ 2000 সাল থেকে উইন্ডোজের সমস্ত সংস্করণ ইউটিএফ -16 ব্যবহার করে।
☦ হ্যাঁ, আমি গ্রোয়েস এসজেট (ẞ) সম্পর্কে জানি , তবে আপনি যদি রাতারাতি সমস্ত জার্মান লোকালকে ß বড় হাতের অক্ষরে পরিণত করতে চান তবে এখনও অন্যান্য প্রচুর ক্ষেত্রে এটি ব্যর্থ হবে। U + FB00 pp sᴍᴀʟʟ ʟɪɢᴀᴛᴜʀᴇ ғғ বড় হাতের চেষ্টা করুন ғғ এখানে ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟɪɢᴀᴛᴜʀᴇ ғғ নেই; এটি কেবলমাত্র দুটি Fs এর বড় হাতের অক্ষরে। বা U + 01F0 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴊ ᴡɪᴛʜ ᴄᴀʀᴏɴ; কোন প্রাক-মূলধন নেই; এটি কেবল একটি রাজধানী জে এবং একটি সংমিশ্রিত কারনের বড় হাতের অক্ষর।
ইউনিকোড স্ট্যান্ডার্ড লাইব্রেরি দ্বারা সমর্থিত নয় (সমর্থিত কোনও যুক্তিসঙ্গত অর্থের জন্য)।
std::string
এর চেয়ে ভাল আর নয় std::vector<char>
: এটি ইউনিকোড (বা অন্য কোনও উপস্থাপনা / এনকোডিং) সম্পর্কে সম্পূর্ণ অসচেতন এবং কেবলমাত্র এটির বিষয়বস্তুকে বাইটের ব্লব হিসাবে বিবেচনা করবে ।
আপনি শুধুমাত্র দোকান এবং সন্নিবদ্ধ করা দরকার হয় তাহলে ব্লব , এটা প্রশংসনীয় ভাল কাজ করে; তবে আপনি ইউনিকোড কার্যকারিতা ( কোড পয়েন্টের সংখ্যা, গ্রাফিমের সংখ্যা ইত্যাদি) এর ইচ্ছামত আপনার ভাগ্যের বাইরে চলে যান।
আমি এর জন্য পরিচিত একমাত্র বিস্তৃত গ্রন্থাগার হ'ল আইসিইউ । সি ++ ইন্টারফেসটি জাভা এক থেকে নেওয়া হয়েছিল, সুতরাং এটি অহংকারবাদী far
আপনি নিশ্চিন্তে একটি হল UTF-8 সংরক্ষণ করতে পারেন std::string
(অথবা একটি char[]
অথবা char*
, যে বিষয়টি জন্য) যে, আসলে একটি ইউনিকোড NUL (ইউ + + 0000) হল UTF-8 একটি নাল বাইট কারণে এবং এই একমাত্র উপায় নাল যে বাইট UTF-8 এ ঘটতে পারে। অত: পর, আপনার হল UTF-8 স্ট্রিং সঠিকভাবে সি এবং সি ++ স্ট্রিং ফাংশন সব অনুযায়ী সমাপ্ত হয়ে যাবে, এবং আপনি তাদের (তত্সহ সি ++ iostreams নিয়ে গুলতি করতে std::cout
এবং std::cerr
, তাই যতদিন আপনার লোকেল হল UTF-8)।
আপনি std::string
ইউটিএফ -8 এর জন্য যা করতে পারবেন না তা কোড পয়েন্টগুলির দৈর্ঘ্য। std::string::size()
আপনাকে বাইটে স্ট্রিংয়ের দৈর্ঘ্য বলবে, আপনি যখন ইউটিএফ -8 এর ASCII উপসেটের মধ্যে থাকবেন তখন কোড পয়েন্টের সংখ্যার সমান।
আপনি যদি কোড পয়েন্ট স্তরে ইউটিএফ -8 স্ট্রিংগুলি পরিচালনা করতে চান (তবে কেবল সেগুলি সংরক্ষণ এবং মুদ্রণ করবেন না) বা আপনি যদি ইউটিএফ -16 এর সাথে ডিল করছেন, যার মধ্যে অনেকগুলি অভ্যন্তরীণ নাল বাইট রয়েছে, আপনার সন্ধান করতে হবে প্রশস্ত অক্ষর স্ট্রিং প্রকার।
std::string
এম্বেড থাকা নালগুলি ঠিক জরিমান রেখে আইস্ট্রিমে ফেলে দেওয়া যেতে পারে।
c_str()
কারণ size()
এখনও কাজ করে। কেবলমাত্র ভাঙা APIs (যেমন তারা বেশিরভাগ সি বিশ্বের এম্বেডড নুলগুলি পরিচালনা করতে পারে না) বিরতি।
c_str()
কারণ c_str()
সি স্ট্রিং এমবেডেড নাল থাকতে পারে না এই কারণে যে নাল-টার্মিনেটেড সি স্ট্রিং হিসাবে ডেটা ফেরত আসবে বলে মনে করা হচ্ছে --- যা অসম্ভব।
c_str()
এখন কেবল data()
এটি সমস্ত হিসাবে একই হিসাবে ফেরত । যে আকারের APIs এটি গ্রহণ করে তারা তা গ্রাস করতে পারে। এমন API গুলি যা পারে না, পারে না।
c_str()
নিশ্চিত হয় যে ফলাফলটি একটি এনএইউএল চর-সদৃশ বস্তু দ্বারা অনুসরণ করা হয়েছে এবং আমি মনে করি না data()
does না, মনে হচ্ছে data()
এখন তাও করে। (অবশ্যই, এটি এপিআইগুলির জন্য প্রয়োজনীয় নয় যা টার্মিনেটর অনুসন্ধান থেকে অনুমান করার পরিবর্তে আকারটি গ্রাস করে)
সি ++ 11 এ ইউনিকোডের জন্য বেশ কয়েকটি নতুন আক্ষরিক স্ট্রিংয়ের ধরণ রয়েছে ।
দুর্ভাগ্যক্রমে অ-ইউনিফর্ম এনকোডিংগুলির (ইউটিএফ -8 এর মতো) স্ট্যান্ডার্ড লাইব্রেরিতে সমর্থন এখনও খারাপ। উদাহরণস্বরূপ, কোনও ইউটিএফ -8 স্ট্রিংয়ের দৈর্ঘ্য (কোড-পয়েন্টগুলিতে) পাওয়ার কোনও দুর্দান্ত উপায় নেই।
std::string
করতে রাখা সমস্যা ছাড়া একটি হল UTF-8 স্ট্রিং, কিন্তু যেমন length
পদ্ধতি স্ট্রিং বাইটের সংখ্যা এবং কোড-পয়েন্ট সংখ্যার উল্লেখ করে।
ñ
'ল্যাটিন স্মার্ট লেটার এন উইথ টিল্ড' (ইউ + 00 এফ 1) (যা একটি কোড পয়েন্ট) বা 'ল্যাটিন ছোট লেটার এন' ( ইউ + 006E) এর পরে 'কম্বিনিং টিल्ड' (ইউ + 0303) যা দুটি কোড পয়েন্ট।
LATIN SMALL LETTER N'
== বিবেচনা করে কিনা (U+006E) followed by 'COMBINING TILDE' (U+0303)
।
যাইহোক, ক্ষুদ্র-utf8 নামে একটি কার্যকরী দরকারী লাইব্রেরি রয়েছে , যা মূলত / এর জন্য একটি ড্রপ-ইন প্রতিস্থাপন । এটি এখনও নিখোঁজ হওয়া utf8-স্ট্রিং ধারক শ্রেণীর শূন্যস্থান পূরণ করা।std::string
std::wstring
এটি utf8 স্ট্রিংগুলির সাথে 'ডিল করার' সবচেয়ে আরামদায়ক উপায় হতে পারে (এটি ইউনিকোড নরমালাইজেশন এবং অনুরূপ স্টাফ ছাড়াই)। আপনার স্ট্রিং রান-লেংথ-এনকোড হওয়াগুলিতে এনকোড থাকা অবস্থায় আপনি কোডপয়েন্টগুলিতে স্বাচ্ছন্দ্যে পরিচালনা করেন char
।