2009-05-16 5 views
25

Je construis une API qui me permet d'extraire des chaînes dans divers encodages, y compris utf8, utf16, utf32 et wchar_t (qui peut être utf32 ou utf16 selon OS).Nouveaux caractères Unicode en C++ 0x

  1. Nouveau standard C++ a introduit de nouveaux types char16_t et char32_t qui n'ont pas cette ambiguïté sizeof et devraient être utilisés à l'avenir, donc je voudrais les soutenir aussi bien, mais la question est, seraient-ils interférer avec uint16_t, uint32_t, wchar_t types ne permettant pas la surcharge parce qu'ils peuvent se rapporter au même type?

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

    Je peux écrire:

    foo.set(U"Some utf32 String"); 
    foo.set(u"Some utf16 string"); 
    
  2. Quels sont les typedef de std::basic_string<char16_t> et std::basic_string<char32_t> comme aujourd'hui:

    typedef basic_string<wchar_t> wstring. 
    

    Je ne peux trouver aucune référence.

    Edit: selon les en-têtes de gcc-4.4, qui ont introduit ces nouveaux types:

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

    Je veux juste vous assurer que c'est une exigence standard réelle et non gcc-isme.

+0

Vous semblez avoir involontairement inversé mon correctif trivial s/interfer/interfere/orthographe ection. – ephemient

+0

Merci, fusionné votre solution de retour. – Artyom

Répondre

30

1) char16_t et char32_t seront distincts types nouveaux, surcharge etc. eux sera possible.

Citation de ISO/IEC JTC1 SC22 WG21 N2018:

Define char16_t être un typedef à un nouveau type distinct, avec le nom _Char16_t qui a la même taille et la représentation que uint_least16_t. De même, définir char32_t être un typedef à un nouveau type distinct, avec le nom _Char32_t qui a la même taille que la représentation et uint_least32_t.

explication plus (d'un article devx.com "Prepare Yourself for the Unicode Revolution"):

Vous vous demandez probablement pourquoi les _Char16_t et _Char32_t types et mots-clés sont nécessaires en premier lieu lorsque le typedefs uint_least16_t et uint_least32_t sont déjà disponibles. Le problème principal que les nouveaux types résolvent est la surcharge. Il est maintenant possible de surcharger les fonctions qui prennent _Char16_t et _Char32_t arguments, et de créer des spécialisations telles que std::basic_string<_Char16_t> qui sont distincts des std::basic_string <wchar_t>.

2) u16string et u32string sont en effet une partie de C++ 0x et pas seulement GCC'isms, comme ils sont mentionnés dans various standard draft papers. Ils seront inclus dans le nouvel en-tête <string>. Citation du même article:

La bibliothèque standard sera également _Char16_t et _Char32_t typedefs, par analogie avec les typedefs wstring, wcout, etc., pour les classes standard suivantes:

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

+0

Merci beaucoup, c'était vraiment utile! – Artyom

+1

Selon le projet standard, 'char16/32_t' sont des mots-clés, pas typedefs. Qui a raison? – Philipp

+0

Dans la version 4.7.3 de gcc, char16_t/char32_t sont des mots-clés. J'ai vérifié. Vous pouvez définir une variable appelée 'int32_t' (c'est un typedef) mais pas' char32_t' (c'est un mot-clé). –

Questions connexes