سؤال

أقوم بإنشاء واجهة برمجة تطبيقات تسمح لي بجلب سلاسل بترميزات مختلفة، بما في ذلك utf8 وutf16 وutf32 وwchar_t (التي قد تكون utf32 أو utf16 وفقًا لنظام التشغيل).

  1. قدم معيار 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");
    
  2. ما هي أنواع 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 هناك حاجة إلى الأنواع والكلمات الرئيسية في المقام الأول عندما typedefs uint_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، قياسا على typedefs wstring, wcout, وما إلى ذلك للفئات القياسية التالية:

filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream, string

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top