2009-03-07 10 views

Respuesta

15

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

  • 0

    Gracias dirkgently. Todavía no estoy registrado, así que no puedo votar ni responder directamente como un comentario.

    He aprendido algo con codecvt. Sabía de las bibliotecas que sugieres y el siguiente recurso también puede ser útil http://www.unicode.org/Public/PROGRAMS/CVTUTF/.

    El proyecto es para una biblioteca que debe ser de código abierto. Preferiría minimizar las dependencias con bibliotecas externas. Ya tengo una dependencia con libgc y boost, aunque para el último solo uso threads. Realmente preferiría mantener el estándar de C++ y estoy un poco decepcionado de que el soporte de GC haya sido eliminado de alguna manera.

    Aparentemente se dice que VC++ express 2008 es compatible con la mayor parte del estándar C++ 0x así como icc. Dado que actualmente desarrollo con VC++ y aún demorará un poco hasta que la biblioteca sea lanzada, me gustaría intentar usar codecvt y char32_t strings.

    ¿Alguien sabe cómo hacer esto? ¿Debo publicar otra pregunta?

    +0

    Otra pregunta es probablemente la mejor. – dalle

    +0

    @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

    +0

    @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

    Cuestiones relacionadas