Nuovi caratteri Unicode in C ++ 0x
Domanda
Sono buiding un'API che mi permette di recuperare stringhe in varie codifiche, tra cui utf8, UTF16, UTF-32 e wchar_t (che può essere UTF-32 o UTF16 secondo il sistema operativo).
-
Nuovo standard C ++ aveva introdotto nuovi tipi
char16_t
echar32_t
che non hanno questa sizeof ambiguità e dovrebbero essere utilizzati in futuro, quindi vorrei sostenerli pure, ma la domanda è: < strong> avrebbero interferire conuint16_t
normale,uint32_t
,wchar_t
tipi non permettendo sovraccarico perché possono riferirsi a stesso tipo?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 };
Quindi posso solo scrivere:
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
-
Quali sono le typedef di
std::basic_string<char16_t>
estd::basic_string<char32_t>
come oggi:typedef basic_string<wchar_t> wstring.
Non riesco a trovare alcun riferimento.
Edit: in base alle intestazioni di gcc-4.4, che ha introdotto questi nuovi tipi:
typedef basic_string<char16_t> u16string; typedef basic_string<char32_t> u32string;
Voglio solo fare in modo che questo è requisito standard effettivo e non GCC-ismo.
Soluzione
1) char16_t
e char32_t
saranno distinte nuovi tipi, così sovraccarico in pratica, è possibile.
ISO / IEC JTC1 SC22 WG21 N2018 :
Definisci
_Char16_t
essere un typedef per un distinto nuovo tipo, con il nomeuint_least16_t
che ha la stessa dimensione e rappresentazione come_Char32_t
. Analogamente, definireuint_least32_t
essere un typedef ad un nuovo tipo esterno, con il nomestd::basic_string<_Char16_t>
che ha lo stesso dimensioni e rappresentazione comestd::basic_string <wchar_t>
.
Ulteriori spiegazioni (da un articolo di devx.com " preparatevi per la rivoluzione Unicode "):
Probabilmente vi state chiedendo perché la
u16string
eu32string
tipi e le parole chiave sono necessarie in primo luogo quando i typedef<string>
ewstring
sono già disponibili. Il problema principale che i nuovi tipi risolvere è sovraccarico. Nevica possibile sovraccaricare funzioni che prenderewcout
efilebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
argomenti, e creare specializzazioni comestring
che sono distinti da <=>.
2) <=> e <=> sono infatti parte di C ++ 0x e non solo GCC'isms, quando sono menzionati in vari progetti di carte standard di . Saranno inclusi nella nuova intestazione <=>. Citazione dal medesimo articolo:
La libreria standard fornirà anche <=> e <=> typedefs, in analogia con il typedef <=>, <=>, ecc, per le seguenti categorie standard:
<=> <=>