2009-05-16 2 views
25

Ich baue eine API, die es mir ermöglicht, Strings in verschiedenen Codierungen, einschließlich utf8, utf16, utf32 und wchar_t (das kann utf32 oder utf16 nach OS sein) zu holen.Neue Unicode-Zeichen in C++ 0x

  1. Neue C++ Standard neue Typen char16_t und char32_t eingeführt hatte, die in Zukunft verwendet werden, nicht über diese sizeof Mehrdeutigkeit haben und sollte so möchte ich sie auch unterstützen, aber die Frage ist, würden sie stören mit normalen uint16_t, uint32_t, wchar_t Typen, die keine Überlast zulassen, weil sie sich auf denselben Typ beziehen können?

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

    So kann ich nur schreiben:

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

    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 möchte nur sicherstellen, dass diese Anforderung tatsächlichen Standard und nicht die gcc-ism.

+0

Sie scheinen unbeabsichtigt meine Trivial s/Interfer/Interfer/Rechtschreibung corr umgekehrt Ektion. – ephemient

+0

Danke, fusioniert Ihre Lösung zurück. – Artyom

Antwort

30

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

Zitat von ISO/IEC JTC1 SC22 WG21 N2018:

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

Weitere Erklärungen (von devx.com Artikel "Prepare Yourself for the Unicode Revolution"):

Du bist wahrscheinlich die _Char16_t und _Char32_t Typen und Schlüsselwörter fragen, warum in erster Linie erforderlich sind, wenn die typedefs uint_least16_t und uint_least32_t sind bereits verfügbar. Das Hauptproblem, das die neuen Typen lösen, ist Überlastung. Es ist jetzt möglichen Funktionen zu überlasten, die _Char16_t und _Char32_t Argumente und erstellen Spezialisierungen wie std::basic_string<_Char16_t> , die von std::basic_string <wchar_t> verschieden sind.

2) u16string und u32string sind in der Tat ein Teil von C++ 0x und nicht nur GCC'isms, wie sie in various standard draft papers erwähnt werden. Sie werden in den neuen Header <string> aufgenommen. Zitat aus dem gleichen Artikel:

Der Standard Library wird auch _Char16_t und _Char32_t typedefs, in Analogie zu dem typedefs wstring, wcout usw. für folgende Standardklassen:

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

+0

Vielen Dank, das war sehr hilfreich! – Artyom

+1

Laut dem Standardentwurf sind 'char16/32_t' Schlüsselwörter, nicht typedefs. Wer hat Recht? – Philipp

+0

In der gcc-Version 4.7.3 sind char16_t/char32_t Schlüsselwörter. Ich überprüfte. Sie können eine Variable mit dem Namen 'int32_t' definieren (es ist ein typedef), aber nicht' char32_t' (es ist ein Schlüsselwort). –