c++ unicode c++11 char16-t char32-t

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 que uint_least16_t . Del mismo modo, defina char32_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 que uint_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 los uint_least16_t y uint_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 como std::basic_string<_Char16_t> que son distintas de std::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 con wstring , 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).

  1. El nuevo estándar de C ++ introdujo nuevos tipos char16_t y char32_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 los uint16_t normales uint16_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");

  2. ¿Cuál es el typedef de std::basic_string<char16_t> y std::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.