2010-06-04 10 views
11

¿Cómo escribo una faceta std :: codecvt? Me gustaría escribir unos que vayan de UTF-16 a UTF-8, que van desde UTF-16 a la página de códigos actual del sistema (Windows, entonces CP_ACP), y a la página de códigos OEM del sistema (Windows, entonces CP_OEM).¿Cómo escribo una faceta std :: codecvt?

Se prefiere multiplataforma, pero MSVC en Windows también está bien. ¿Hay algún tipo de tutoriales o algo de esa naturaleza sobre cómo usar correctamente esta clase?

+0

que te pueden echar un vistazo a [el ejemplo de la libstdC++ manual] (http://gcc.gnu.org/onlinedocs/libstdc++/manual/codecvt.html). –

+0

Para configuraciones regionales y facetas, el único libro que conozco que entra en detalle es http://www.angelikalanger.com/iostreams.html pero solo tiene algunas páginas en codecvt específicamente. –

+3

No puedo creer que nadie parezca estar en cuclillas sobre esta clase en la biblioteca estándar, especialmente teniendo en cuenta lo potencialmente útil que puede ser ... –

Respuesta

9

He escrito uno basado en iconv. Se puede usar en Windows o en cualquier sistema operativo POSIX. (Necesitarás enlazar con iconv obviamente).

Enjoy

La respuesta para el "cómo" cuestión es seguir the codecvt reference. No pude encontrar mejores instrucciones en Internet hace dos años.

avisos importantes

  • teóricamente no hay necesidad para tal trabajo. codecvt_byname debería ser suficiente en cualquier plataforma de soporte estándar. Pero en realidad hay algunos compiladores que no admiten o apoyan mal esta clase. También hay una diferencia en las interfaces de codecvt_byname en diferentes compiladores.
  • mi ejemplo de trabajo se implementa con el parámetro de plantilla de estado de codecvt. Siempre use el tipo de mbstate estándar allí ya que esta es la única forma de usar su codecvt con las clases de iostream estándar.
  • std :: mbstate_t tipo no se puede utilizar como un puntero en plataformas de 64 bits de forma multiplataforma.
  • conversiones sin estado trabajan para cadenas cortas, pero pueden fallar si intenta convertir un mayor trozo de datos que streambuf tamaño del buffer interno (UTF es esencialmente codificación con estado)
+1

+1 - No sabía que 'codecvt_byname' existía, y resulta que mi compilador realmente soporta tal cosa correctamente. (¿Quién sabe?) No aceptar esto aún porque no es una respuesta directa a la pregunta, pero si/cuando la recompensa expire obtendrá los puntos de todos modos. –

4

El problema con este std :: codecvt es que es una solución que busca un problema. O más bien, el problema que está tratando de resolver es insoluble, por lo que cualquiera que intente usarlo como solución va a estar muy decepcionado.

Si no sabe qué carácter establece su entrada o salida, entonces std :: codecvt nunca podrá ayudarlo. Por el contrario, si hace sabe qué juegos de caracteres está utilizando, entonces puede convertir trivialmente entre ellos con una sola llamada a función. Envolver esa llamada de función en un lío complicado de plantillas no cambia esos fundamentos.

... y es por eso que nadie usa std :: codecvt. Te recomiendo que hagas lo que hacen todos los demás y pretendas que nunca sucedió.

+2

Sé exactamente qué página de códigos y qué estoy usando. Quiero poder especificar qué página de códigos usar para iostreams. Y la única forma de hacerlo es con 'std :: codecvt'. Claro, puedo convertir un bloque de texto entre páginas de códigos sin ningún problema, pero no hay forma de decir, "formatee este entero de 8 espacios, llene los espacios en blanco" sin un gran lío de 'std :: wstringstream' s.Prefiero simplemente hacer que iostreams se convierta de forma nativa a la página de códigos correcta dado que ya tiene una facilidad para hacerlo. -1 por no responder la pregunta. –

+4

En cuanto a "Nadie usa' std :: codecvt' ", ¿puede explicar por qué las facetas de conversión para Unicode se están agregando en C++ 0x, y http://www.boost.org/doc/libs/1_43_0/libs/ serialización/doc/codecvt.html? –

+2

Probablemente con la esperanza de que las personas * comiencen * a usar std :: codecvt una vez que ya no sea inútil. – apenwarr

Cuestiones relacionadas