De nouveaux caractères unicode dans C ++ 0x
Question
Je buiding une API qui me permet de chaînes dans diverses aille chercher encodages, y compris UTF8, utf16, UTF32 et wchar_t (qui peut être UTF32 ou utf16 selon OS).
-
Nouveau standard C ++ a introduit de nouveaux types et
char16_t
qui n'ontchar32_t
pas cette ambiguïté sizeof et devraient être utilisés à l'avenir, donc je voudrais les soutenir aussi bien, mais la question est, < strong> seraient-ils interférer avec la normaleuint16_t
,uint32_t
, types ne permettant paswchar_t
surcharge car ils peuvent se référer à un 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 simplement écrire:
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
-
Quels sont les typedef et
std::basic_string<char16_t>
comme il y astd::basic_string<char32_t>
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.
La solution
1) et char16_t
seront distincts char32_t
nouveaux types, la surcharge ainsi de leur sera possible.
Citation de ISO / IEC JTC1 SC22 WG21 N2018 :
Définir être un
_Char16_t
typedef à un nouveau type distinct, avec le nom Qui a lauint_least16_t
même taille et la représentation que_Char32_t
. De même, définir comme unuint_least32_t
typedef à un nouveau type distinct, avec le nom qui a lestd::basic_string<_Char16_t>
même la taille et la représentation en tant questd::basic_string <wchar_t>
.
Des explications complémentaires (d'un article devx.com « Preparez-vous pour la Révolution Unicode "):
Vous vous demandez probablement pourquoi la Et types
u16string
et mots-clésu32string
sont nécessaires en premier lieu lorsque les typedefs et<string>
Sont déjà disponibleswstring
. Le principal problème que les nouveaux types résoudre est la surcharge. La neige possible de surcharger des fonctions prendre etwcout
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
arguments, et créer des spécialisations commestring
qui sont distincts <=>.
2) et <=> sont en effet partie <=> de C ++ 0x et pas seulement GCC'isms, comme ils sont mentionnés dans divers documents de projet de norme . Ils seront inclus dans le nouvel en-tête de <=>. Citation du même article:
La bibliothèque standard sera également fournir Et typedefs <=> <=>, par analogie avec les typedefs <=>, <=>, etc., pour les classes standard suivantes:
<=> <=>