সি ++ 11 এ স্ট্রিং লিটারেলের জন্য ইউনিকোড এনকোডিং


85

সম্পর্কিত প্রশ্ন অনুসরণ করে , আমি C ++ 11 এ নতুন চরিত্র এবং স্ট্রিং আক্ষরিক ধরণের সম্পর্কে জিজ্ঞাসা করতে চাই। দেখে মনে হচ্ছে আমাদের কাছে এখন চার ধরণের অক্ষর এবং পাঁচ ধরণের স্ট্রিং ল্যাটারাল রয়েছে। চরিত্রের প্রকারগুলি:

char     a =  '\x30';         // character, no semantics
wchar_t  b = L'\xFFEF';       // wide character, no semantics
char16_t c = u'\u00F6';       // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF';   // 32-bit, assumed UCS-4

এবং স্ট্রিং আক্ষরিক:

char     A[] =  "Hello\x0A";         // byte string, "narrow encoding"
wchar_t  B[] = L"Hell\xF6\x0A";      // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6";        // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto     E[] = u8"\u00F6\U0010FFFF"; // (3)

প্রশ্নটি হ'ল: \x/ \u/ \Uচরিত্রের রেফারেন্সগুলি কি সমস্ত স্ট্রিং প্রকারের সাথে অবাধে একত্রিতযোগ্য? সমস্ত স্ট্রিং প্রকারগুলি স্থির-প্রস্থ, অর্থাত্ অ্যারেগুলিতে আক্ষরিক হিসাবে উপস্থিত অনেকগুলি উপাদান রয়েছে বা \x/ \u/ \Uরেফারেন্সগুলিতে একটি চলক সংখ্যা বাইটে প্রসারিত হয়? কি u""এবং u8""স্ট্রিং শব্দার্থবিদ্যা এনকোডিং আছে, যেমন আমি বলতে পারি char16_t x[] = u"\U0010FFFF", এবং অ বিএমপি কোডপয়েন্ট দুই ইউনিট UTF16 ক্রম মধ্যে এনকোড পায়? এবং একইভাবে জন্য u8? (1) এ, আমি কি একা সারোগেট দিয়ে লিখতে পারি \u? পরিশেষে, এনকোডিংয়ের স্ট্রিং ফাংশনগুলির কোনও কি সচেতন (যেমন তারা অক্ষর-সচেতন এবং অবৈধ বাইট ক্রমগুলি সনাক্ত করতে পারে)?

এটি কিছুটা উন্মুক্ত সমাপ্ত প্রশ্ন, তবে আমি নতুন ইউটিএফ-এনকোডিং এবং নতুন সি ++ 11 টাইপ সুবিধাগুলির যথাসম্ভব সম্পূর্ণ চিত্র পেতে চাই।


4
জিসিসি u"\U0010FFFF"একটি সারোগেট জোড়ায় এনকোড করে।
কেনেটিএম

উত্তর:


57

String x / \ u / \ U অক্ষরের রেফারেন্সগুলি কি সমস্ত স্ট্রিং প্রকারের সাথে অবাধে সংযুক্তযোগ্য?

নং \xকিছু ব্যবহার করা যাবে, কিন্তু \uএবং \Uশুধুমাত্র স্ট্রিং বিশেষভাবে হল UTF-এনকোডেড থাকে ব্যবহার করা যেতে পারে। যাইহোক, যে কোনও ইউটিএফ-এনকোডেড স্ট্রিংয়ের জন্য \uএবং \Uআপনি উপযুক্ত হিসাবে দেখতে ব্যবহার করতে পারেন।

সমস্ত স্ট্রিং টাইপগুলি কি স্থির-প্রস্থ, অর্থাৎ অ্যারেগুলিতে আক্ষরিক হিসাবে উপস্থিত অনেকগুলি উপাদান রয়েছে বা \ x / \ u / \ U রেফারেন্সগুলি পরিবর্তনশীল সংখ্যক বাইটে প্রসারিত হয়?

আপনি যেভাবে বলতে চাইছেন তা নয়। \x, \uএবং \Uস্ট্রিং এনকোডিংয়ের ভিত্তিতে রূপান্তরিত হয়। ঐ "কোড ইউনিট" এর সংখ্যা (ইউনিকোড পদ ব্যবহার করে। একটি char16_tমানগুলি রয়েছে স্ট্রিং এর এনকোডিং উপর নির্ভর করে একটি হল UTF-16 কোড একক)। আক্ষরিক u8"\u1024"2 charটি প্লাস একটি নাল টার্মিনেটরযুক্ত একটি স্ট্রিং তৈরি করবে । আক্ষরিক u"\u1024"1 char16_tটি প্লাস একটি নাল টার্মিনেটরযুক্ত একটি স্ট্রিং তৈরি করবে ।

ব্যবহৃত কোড ইউনিটের সংখ্যা ইউনিকোড এনকোডিংয়ের উপর ভিত্তি করে।

আপনার "" এবং u8 "" স্ট্রিংগুলিতে এনকোডিং শব্দার্থবিজ্ঞান রয়েছে, উদাহরণস্বরূপ আমি বলতে পারি char16_t x [] = u "\ U0010FFFF", এবং নন-বিএমপি কোডপয়েন্টটি একটি দুই-ইউনিট ইউটিএফ 16 ক্রমে এনকোড হয়ে গেছে?

u""একটি ইউটিএফ -16 এনকোডেড স্ট্রিং তৈরি করে। u8""একটি ইউটিএফ -8 এনকোডেড স্ট্রিং তৈরি করে। তারা ইউনিকোড স্পেসিফিকেশন অনুযায়ী এনকোড করা হবে।

(1) এ, আমি কি \ u দিয়ে একা সারোগেট লিখতে পারি?

একেবারে না. স্পেসিফিকেশনটি ইউটিএফ -16 সারোগেট জোড়া (0xD800-0xDFFF) এর কোডড পয়েন্ট হিসাবে \uবা এর জন্য স্পষ্টভাবে ব্যবহার নিষিদ্ধ করেছে \U

পরিশেষে, এনকোডিংয়ের স্ট্রিং ফাংশনগুলির কোনও কি সচেতন (যেমন তারা অক্ষর-সচেতন এবং অবৈধ বাইট ক্রমগুলি সনাক্ত করতে পারে)?

একেবারে না. ঠিক আছে, আমাকে তা পুনরায় বলার অনুমতি দিন।

std::basic_stringইউনিকোড এনকোডিংগুলির সাথে ডিল করে না। তারা অবশ্যই ইউটিএফ-এনকোডযুক্ত স্ট্রিংগুলি সঞ্চয় করতে পারে । কিন্তু তারা শুধুমাত্র ক্রমের সাথে তাদের মনে করতে পারেন char, char16_tঅথবা char32_t; তারা এগুলি ইউনিকোড কোডপয়েন্টগুলির ক্রম হিসাবে ভাবতে পারে না যে কোনও নির্দিষ্ট ব্যবস্থার সাথে এনকোড করা আছে। basic_string::length()কোড পয়েন্ট নয়, কোড ইউনিটের সংখ্যা প্রদান করবে। এবং স্পষ্টতই, সি স্ট্যান্ডার্ড লাইব্রেরি স্ট্রিং ফাংশন সম্পূর্ণ অকেজো

তবে এটি লক্ষ করা উচিত যে ইউনিকোড স্ট্রিংয়ের জন্য "দৈর্ঘ্য" এর অর্থ কোডপয়েন্টের সংখ্যা নয়। কিছু কোড পয়েন্টগুলি "অক্ষর" (একটি দুর্ভাগ্যজনক নাম) এর সমন্বয় করছে, যা পূর্ববর্তী কোডপয়েন্টের সাথে একত্রিত হয়। সুতরাং একাধিক কোডপয়েন্টগুলি একটি একক ভিজ্যুয়াল চরিত্রের মানচিত্র করতে পারে।

আইস্ট্রিমগুলি আসলে ইউনিকোড-এনকোডেড মানগুলি পড়তে / লিখতে পারে। এটি করতে, আপনাকে এনকোডিং নির্দিষ্ট করতে এবং স্থানীয়ভাবে যথাযথভাবে বিভিন্ন স্থানে লাগাতে একটি লোকেল ব্যবহার করতে হবে। এটি করা হয়ে ওঠার চেয়ে সহজ, এবং কীভাবে তা দেখানোর জন্য আমার কাছে কোনও কোড নেই।


7
@ ফিলিপ: না, তারা নেই। ইউনিকোড তাদের বিশেষত ইউটিএফ -16 সারোগেটের জন্য সংরক্ষণ করে। এবং যেমনটি বলা হয়েছে, সি ++ 0 এক্স এর স্পেসিফিকেশন বলছে যে আপনি যদি এই ব্যাপ্তিতে কোনও কোড পয়েন্ট নির্ধারণ করার চেষ্টা করেন তবে সংকলন ব্যর্থ হবে।
নিকল বোলাস

12
আপনার লিঙ্ক প্রমাণ করে তারা হয় কোড পয়েন্ট। আপনি যদি উইকিপিডিয়াকে বিশ্বাস করেন না, তবে স্ট্যান্ডার্ডের 3 য় অধ্যায় 9 এবং 10 সংজ্ঞাটি পড়ুন। স্ট্রিং লিটারে সারোগেট কোড পয়েন্টগুলি নিয়ম § 2.4 / 2 দ্বারা সি ++ 0x এ নিষিদ্ধ করা হয়েছে।
ফিলিপ

4
পড়ার পরে আমি আরও নিশ্চিত করি যে সারোগেট কোড পয়েন্টগুলি স্ট্রিং লিটারেলে গ্রহণযোগ্য।
জর্জ কোরিটিস

সি 11 এ, \xকোনও কিছুর সাথে ব্যবহার করা যাবে না, উদাহরণস্বরূপ U + 1F984 \ x উপসর্গের সাথে কাজ করবে না \uএবং \Uএএসসিআইআই নিয়ন্ত্রণ অক্ষরগুলির সাথে ব্যবহার করা যাবে না, কমপক্ষে ক্ল্যাংয়ে।
মার্কাস জে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.