Nuevos caracteres Unicode en C++ 0x
c++11 char16-t (1)
1) char16_t
y char32_t
serán nuevos tipos distintos, por lo que será posible sobrecargarlos.
Cita de ISO / IEC JTC1 SC22 WG21 N2018 :
Defina
char16_t
para ser un typedef a un nuevo tipo distinto, con el nombre_Char16_t
que tiene el mismo tamaño y representación queuint_least16_t
. Del mismo modo, definachar32_t
para que sea un typedef a un nuevo tipo distinto, con el nombre_Char32_t
que tenga el mismo tamaño y representación queuint_least32_t
.
Más explicaciones (de un artículo de devx.com " Prepárate para la revolución Unicode "):
Probablemente se esté preguntando por qué los tipos
_Char16_t
y_Char32_t
y las palabras clave son necesarios en primer lugar cuando losuint_least16_t
yuint_least32_t
ya están disponibles. El principal problema que resuelven los nuevos tipos es la sobrecarga. Ahora es posible sobrecargar las funciones que toman los argumentos_Char16_t
y_Char32_t
y crear especializaciones comostd::basic_string<_Char16_t>
que son distintas destd::basic_string <wchar_t>
.
2) u16string
y u32string
son de hecho parte de C ++ 0x y no solo de GCC''isms, ya que se mencionan en varios borradores estándar . Se incluirán en el nuevo encabezado <string>
. Cita del mismo artículo:
La Biblioteca estándar también proporcionará
_Char16_t
y_Char32_t
, en analogía conwstring
,wcout
, etc., para las siguientes clases estándar:
filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,
string
Estoy construyendo una API que me permite buscar cadenas en varias codificaciones, incluidas utf8, utf16, utf32 y wchar_t (que pueden ser utf32 o utf16 según el SO).
El nuevo estándar de C ++ introdujo nuevos tipos
char16_t
ychar32_t
que no tienen este tamaño de ambigüedad y deberían usarse en el futuro, por lo que me gustaría apoyarlos también, pero la pregunta es, ¿interferirían con losuint16_t
normalesuint16_t
,uint32_t
,wchar_t
no permitiendo 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 };
Entonces puedo escribir:
foo.set(U"Some utf32 String"); foo.set(u"Some utf16 string");
¿Cuál es el typedef de
std::basic_string<char16_t>
ystd::basic_string<char32_t>
como lo es hoy en día?typedef basic_string<wchar_t> wstring.
No puedo encontrar ninguna referencia.
Editar: de acuerdo con los encabezados de gcc-4.4, que introdujo estos nuevos tipos:
typedef basic_string<char16_t> u16string; typedef basic_string<char32_t> u32string;
Solo quiero asegurarme de que este sea el requisito estándar real y no el gcc-ismo.