Neue Unicode-Zeichen in C ++ 0x
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).
-
Neue C ++ Standard war neu eingeführte Arten
char16_t
undchar32_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 normalenuint16_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");
-
Was sind die typedef von
std::basic_string<char16_t>
undstd::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.
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 alsuint_least16_t
hat. Ebenso definierenchar32_t
a zu sein typedef zu einer deutlichen neuen Art, mit der Name_Char32_t
, die die gleiche ist Größe und Darstellung wieuint_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 typedefsuint_least16_t
unduint_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 wiestd::basic_string<_Char16_t>
die unterscheiden sich vonstd::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 typedefswstring
,wcout
usw. für folgende Standardklassen:
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string