Los nuevos caracteres unicode en C++0x
Pregunta
Estoy buiding una API que permite a mí para buscar cadenas en diferentes codificaciones, incluyendo utf8, utf16, utf32 y wchar_t (que puede ser utf32 o utf16 de acuerdo a OS).
Nuevo estándar de C++ habían introducido nuevos tipos de
char16_t
ychar32_t
que no tienen este sizeof ambigüedad y debe ser utilizado en el futuro, así que me gustaría apoyar, pero la pregunta es, iban a interferir con normaluint16_t
,uint32_t
,wchar_t
tipos de no permitir la sobrecarga porque pueden referirse al mismo 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 };
Así que sólo puedo escribir:
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
¿Cuáles son las definiciones de
std::basic_string<char16_t>
ystd::basic_string<char32_t>
como hay hoy en día:typedef basic_string<wchar_t> wstring.
No puedo encontrar ninguna referencia.
Editar:de acuerdo a los encabezados de gcc-4.4, que introducen estos nuevos tipos:
typedef basic_string<char16_t> u16string; typedef basic_string<char32_t> u32string;
Sólo quiero para asegurarse de que esto es real requisito estándar y no gcc-ism.
Solución
1) char16_t
y char32_t
serán distintos tipos nuevos, por lo que la sobrecarga de ellos será posible.
Cita de ISO/IEC JTC1 SC22 WG21 N2018:
Definir
char16_t
para ser un typedef para un distintas nuevo tipo, con el nombre de_Char16_t
que tiene el mismo tamaño y la representación comouint_least16_t
.Asimismo, definirchar32_t
para ser un typedef a distintas nuevo tipo, con el nombre_Char32_t
que tiene el mismo el tamaño y la representación comouint_least32_t
.
La explicación adicional (a partir de un devx.com el artículo "Prepárate para la Revolución Unicode"):
Probablemente te estés preguntando por qué la
_Char16_t
y_Char32_t
tipos y las palabras clave que se necesitan en el primer lugar cuando el typedefsuint_least16_t
yuint_least32_t
ya están disponibles.El principal problema que los nuevos tipos resolver es la sobrecarga.Ahora posible sobrecarga de funciones que tomar_Char16_t
y_Char32_t
los argumentos, y crear especializaciones comostd::basic_string<_Char16_t>
que son distintos destd::basic_string <wchar_t>
.
2) u16string
y u32string
son de hecho parte de C++0x y no sólo GCC'isms, como son mencionados en varios borrador de estándar de documentos.No estarán incluidos en el nuevo <string>
encabezado.Cita del mismo artículo:
La Biblioteca Estándar también se proporcionan
_Char16_t
y_Char32_t
las definiciones de tipos, en analogía a la typedefswstring
,wcout
, etc., para el siguiente modelo de clases:
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string