أحرف Unicode جديدة في C++0x
سؤال
أقوم بإنشاء واجهة برمجة تطبيقات تسمح لي بجلب سلاسل بترميزات مختلفة، بما في ذلك utf8 وutf16 وutf32 وwchar_t (التي قد تكون utf32 أو utf16 وفقًا لنظام التشغيل).
قدم معيار C++ الجديد أنواعًا جديدة
char16_t
وchar32_t
التي ليس بها هذا الحجم من الغموض ويجب استخدامها في المستقبل، لذا أود أن أدعمها أيضًا، ولكن السؤال هو، هل سيتدخلون مع عاديuint16_t
,uint32_t
,wchar_t
الأنواع التي لا تسمح بالحمل الزائد لأنها قد تشير إلى نفس النوع؟class some_class { public: void set(std::string); // utf8 string void set(std::wstring); // wchar string utf16 or utf32 according // to sizeof(wchar_t) void set(std::basic_string<uint16_t>) // wchar independent utf16 string void set(std::basic_string<uint32_t>); // wchar independent utf32 string #ifdef HAVE_NEW_UNICODE_CHARRECTERS void set(std::basic_string<char16_t>) // new standard utf16 string void set(std::basic_string<char32_t>); // new standard utf32 string #endif };
لذلك لا يسعني إلا أن أكتب:
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
ما هي أنواع
std::basic_string<char16_t>
وstd::basic_string<char32_t>
كما هو موجود اليوم :typedef basic_string<wchar_t> wstring.
لا أستطيع العثور على أي مرجع.
يحرر:وفقًا لرؤوس gcc-4.4، التي قدمت هذه الأنواع الجديدة:
typedef basic_string<char16_t> u16string; typedef basic_string<char32_t> u32string;
أريد فقط التأكد من أن هذا هو المطلب القياسي الفعلي وليس مذهب دول مجلس التعاون الخليجي.
المحلول
1) char16_t
و char32_t
ستكون أنواعًا جديدة مميزة، لذا سيكون التحميل الزائد عليها ممكنًا.
اقتباس من ISO/IEC JTC1 SC22 WG21 N2018:
يُعرِّف
char16_t
لتكون typedef لنوع جديد متميز ، مع الاسم_Char16_t
التي لها نفس الحجم والتمثيل كماuint_least16_t
.وبالمثل، تعريفchar32_t
لتكون typedef لنوع جديد متميز ، مع الاسم_Char32_t
هذا له نفس الحجم والتمثيل كماuint_least32_t
.
مزيد من التوضيح (من مقالة devx.com "جهز نفسك لثورة Unicode"):
ربما تتساءل لماذا
_Char16_t
و_Char32_t
هناك حاجة إلى الأنواع والكلمات الرئيسية في المقام الأول عندما typedefsuint_least16_t
وuint_least32_t
متاحة بالفعل.المشكلة الرئيسية التي يحلها الأنواع الجديدة هي التحميل الزائد.من الممكن الآن أن تتفوق على الوظائف التي تتخذها_Char16_t
و_Char32_t
الحجج ، وإنشاء تخصصات مثلstd::basic_string<_Char16_t>
التي تختلف عنstd::basic_string <wchar_t>
.
2) u16string
و u32string
هي في الواقع جزء من C++0x وليس فقط معتقدات دول مجلس التعاون الخليجي، كما تم ذكرها في مختلف مشاريع الأوراق القياسية.سيتم تضمينهم في الجديد <string>
header.اقتباس من نفس المقال:
ستوفر المكتبة القياسية أيضًا
_Char16_t
و_Char32_t
typedefs، قياسا على typedefswstring
,wcout
, وما إلى ذلك للفئات القياسية التالية:
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string