2009-05-16 20 views
25

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).Nuevos caracteres Unicode en C++ 0x

  1. nuevo estándar de C++ había introducido nuevos tipos char16_t y char32_t que no tienen esta ambigüedad sizeof y deben ser utilizados en el futuro, por lo que me gustaría apoyarlos así, pero la pregunta es, habría que interfieren con normal uint16_t, uint32_t, wchar_t tipos que no permiten 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"); 
    
  2. ¿Cuáles son los typedef de std::basic_string<char16_t> y std::basic_string<char32_t> ya que existe hoy en día:

    typedef basic_string<wchar_t> wstring. 
    

    No puedo encontrar ninguna referencia.

    Editar: de acuerdo a las cabeceras de gcc-4.4, que introdujeron estos nuevos tipos:

    typedef basic_string<char16_t> u16string; 
    typedef basic_string<char32_t> u32string; 
    

    Sólo quiero para asegurarse de que esto es requisito estándar real y no gcc-ismo.

+0

Pareces haber revertido involuntariamente mi trivial s/interferir/interferir/ortografía corr ección. – ephemient

+0

Gracias, fusionó su solución de nuevo. – Artyom

Respuesta

30

1) char16_t y char32_t habrá distintos tipos nuevos, por lo que la sobrecarga en práctica, será posible.

Presupuesto de ISO/IEC JTC1 SC22 WG21 N2018:

Definir char16_t ser un typedef a un nuevo tipo distinto , con el nombre _Char16_t que tiene el mismo tamaño y la representación como uint_least16_t. mismo modo, definir char32_t ser un typedef a un nuevo tipo distinto, con el nombre _Char32_t que tiene el mismo tamaño y la representación como uint_least32_t.

una explicación más detallada (de un artículo devx.com "Prepare Yourself for the Unicode Revolution"):

Probablemente se pregunte por qué se necesitan los _Char16_t y _Char32_t tipos y las palabras clave en el primer lugar cuando el typedefs 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 funciones que toman _Char16_t y _Char32_t argumentos, 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 sólo GCC'isms, ya que se mencionan en various standard draft papers. 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 typedefs, en analogía con los typedefs wstring, wcout, etc., para las siguientes clases estándar:

filebuf, streambuf, streampos, streamoff, ios, istream, ostream, fstream, ifstream, ofstream, stringstream, istringstream, ostringstream,string

+0

¡Muchas gracias, fue realmente útil! – Artyom

+1

De acuerdo con el borrador estándar, 'char16/32_t' son palabras clave, no typedefs. ¿Quién tiene la razón? – Philipp

+0

En gcc versión 4.7.3, char16_t/char32_t son palabras clave. Lo comprobé. Puede definir una variable llamada 'int32_t' (es un typedef) pero no' char32_t' (es una palabra clave). –