Frage

Ich bin buiding eine API, die mir erlaubt, Strings in verschiedenen Kodierungen zu holen, einschließlich UTF-8, utf16, UTF32 und wchar_t (die UTF32 oder utf16 nach O sein kann).

  1. Neue C ++ Standard war neu eingeführte Arten char16_t und char32_t, die in Zukunft verwendet werden, nicht über diese sizeof Mehrdeutigkeit haben und sollte so würde Ich mag sie auch unterstützen, aber die Frage ist, würden sie stören mit normalen uint16_t, uint32_t, wchar_t Typen nicht erlaubt Überlastung, weil sie auf gleiche Art beziehen?

    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
    };
    

    Also ich kann nur schreiben:

    foo.set(U"Some utf32 String");
    foo.set(u"Some utf16 string");
    
  2. Was sind die typedef von std::basic_string<char16_t> und std::basic_string<char32_t> wie es heute ist:

    typedef basic_string<wchar_t> wstring.
    

    Ich kann keinen Hinweis finden.

    Edit: nach Header von gcc-4.4, die diese neuen Typen eingeführt:

    typedef basic_string<char16_t> u16string;
    typedef basic_string<char32_t> u32string;
    

    Ich mag nur sicherstellen, dass diese Anforderung tatsächliche Standard und nicht die gcc-ism.

War es hilfreich?

Lösung

1) char16_t und char32_t werden verschiedene neue Arten sein, so auf sich Überlastung möglich sein werden.

Zitat von ISO / IEC JTC1 SC22 WG21 N2018 :

  

definieren char16_t ein typedef a zu sein   verschiedene neue Art, mit dem Namen   _Char16_t, die die gleiche Größe und die Darstellung als uint_least16_t hat.   Ebenso definieren char32_t a zu sein   typedef zu einer deutlichen neuen Art, mit   der Name _Char32_t, die die gleiche ist   Größe und Darstellung wie   uint_least32_t.

Eine weitere Erklärung (von devx.com Artikel „ Bereiten Sie sich für die Unicode-Revolution "):

  

Sie fragen sich wahrscheinlich, warum die   _Char16_t und _Char32_t Typen und Schlüsselwörter sind in erster Linie erforderlich   wenn die typedefs uint_least16_t und   uint_least32_t sind bereits verfügbar.   Das Hauptproblem, dass die neuen Typen   lösen, ist eine Überlastung. Es schneit   mögliche Funktionen zu überlasten, dass   nehmen _Char16_t und _Char32_t   Argumente, und erstellen Spezialisierungen   wie std::basic_string<_Char16_t>   die unterscheiden sich von   std::basic_string <wchar_t>.

2) u16string und u32string sind in der Tat ein Teil von C ++ 0x und nicht nur GCC'isms, wie sie in verschiedenen Standardentwurf Papiere. Sie werden in den neuen <string> Header enthalten sein. Zitat aus dem gleichen Artikel:

  

Der Standard Library wird auch zur Verfügung stellen   _Char16_t und _Char32_t typedefs, in Analogie zum typedefs wstring,   wcout usw. für folgende Standardklassen:

     

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top