En C++ 0x, char16_t
y char32_t
se usarán para almacenar UTF-16 y UTF-32 y no wchar_t
.
De los proyectos de n2798:
22.2.1.4 codecvt plantilla de clase
2 El codecvt clase es para su uso cuando la conversión de un conjunto de códigos a otro, tal como de caracteres anchos a multibyte caracteres o entre codificaciones de caracteres anchos como Unicode y EUC.
3 Las especializaciones requeridas en la Tabla 76 (22.1.1.1.1) convierten la implementación- conjunto de caracteres nativos definidos. codecvt implementa una conversión degenerada ; no se convierte en absoluto. La especialización codecvt<char16_t, char, mbstate_t>
convierte entre los esquemas de codificación UTF-16 y UTF-8, y la especialización convierte codecvt <char32_t, char, mbstate_t>
entre los esquemas de codificación UTF-32 y UTF-8. codecvt<wchar_t,char,mbstate_t>
convierte entre los juegos de caracteres nativos para caracteres angostos y anchos. Las especializaciones en mbstate_t
realizan la conversión entre codificaciones conocidas por el implementador de la biblioteca.
Otras codificaciones se pueden convertir especializándose en un tipo stateT definido por el usuario. El objeto stateT puede contener cualquier estado que sea útil para comunicarse con o desde los miembros especializados do_in o do_out.
Lo sobre wchar_t
es que no le da ninguna garantía sobre la codificación utilizada. Es un tipo que puede contener un carácter multibyte. Período. Si vas a escribir software ahora, tienes que vivir con este compromiso. Los compiladores que cumplen con C++ 0x aún están muy lejos. Siempre puede probar los compiladores VC2010 CTP y g ++ por lo que vale. Además, wchar_t
tiene diferentes tamaños en diferentes plataformas, que es otra cosa a tener en cuenta (2 bytes en VS/Windows, 4 bytes en GCC/Mac, etc.). Hay entonces opciones como -fshort-wchar
para GCC para complicar aún más el problema.
La mejor solución, por lo tanto, es utilizar una biblioteca existente. Perseguir los errores de UNICODE no es el mejor uso posible de esfuerzo/tiempo. Te sugiero que eche un vistazo a:
Más sobre C++ 0x literales de cadena Unicode GNU libiconv
de IBM here
Otra pregunta es probablemente la mejor. – dalle
@chmike: La falta de soporte lambda en 08 me hizo no buscar más. Sin embargo, puedo echar un vistazo a la compatibilidad con C++ 0x en VS2008 (tengo Pro). ¿No es un proyecto de código abierto mejor respaldado por un compilador de código abierto? Simplemente curioso (incluso si 08 express edn es gratis). ¡Siéntase libre de preguntar más! – dirkgently
@dirkgently Estoy tratando de hacer que el paquete funcione con VC08, g ++ y más tarde con icc. Me obliga a seguir con el estándar. Este esfuerzo me ayudó a encontrar algunos errores que los compiladores no detectaron. Algunos fueron detectados por g ++ y otros por VC08. – chmike