2012-05-03 27 views
5

Si quiero convertir un trozo de cadena a UTF-16, digamos char * xmlbuffer, ¿tengo que convertir el tipo a wchar_t * antes de codificar a UTF-16? ¿Y se requiere el tipo char* antes de codificar a UTF-8?wchar_t y codificación

¿Cómo se relaciona el wchar_t, char con UTF-8 o UTF-16 o UTF-32 u otro formato de transformación?

Gracias de antemano por ayuda!

Respuesta

4

No, no tiene que cambiar los tipos de datos.

Sobre wchar_t: la norma dice que

Tipo wchar_t es un tipo distinto cuyos valores pueden representar distintos códigos para todos los miembros de la mayor conjunto de caracteres ampliado especificada entre las localizaciones soportadas.

Lamentablemente, no dice qué codificación debe tener wchar_t; esto depende de la implementación. Así, por ejemplo dado

auto s = L"foo"; 

puede hacer absolutamente ninguna suposición sobre lo que el valor de la expresión es *s.

Sin embargo, puede utilizar un std::string como una secuencia opaca de bytes que representan el texto en cualquier formato de transformación de su elección sin problema. Simplemente no realice operaciones estándar relacionadas con cadenas de biblioteca en él.

+0

Así que puedo decir que el uso de wchar_t para UTF-16 en la plataforma Windows es sólo una cuestión de elección por conveniencia, puede utilizar absolutamente carbón para UTF-16 en la teoría? – Hunter

+0

@Hunter: En teoría sí, pero en Windows, 'wchar_t' se usa para UTF-16 y' char' para ASCII y UTF-8. –

+0

En Windows, 'wchar_t' tiene un tamaño conocido de 16 bits –

1

El tamaño de wchar_t depende del compilador, por lo que su relación con los distintos formatos Unicode variará.

4

iconv es una función POSIX que puede ocuparse del paso de codificación intermedia. Puede usar iconv_open para especificar que tiene entrada UTF-8 y que desea la salida UTF-16. Luego, usando el identificador devuelto desde iconv_open, puede usar iconv (especificando su buffer de entrada y buffer de salida). Cuando haya terminado debe llamar iconv_close en el mango de regresar de iconv_open liberar recursos etc.

Usted tendrá que leer detenidamente la documentación del sistema acerca de lo codificaciones son apoyados por iconv y su esquema de nombres (es decir, lo que proporcionan iconv_open). Por ejemplo, en algunos sistemas iconv esperan "utf-8" y otros puede esperar "UTF8" etc.

Windows no proporciona una versión de iconv, y en su lugar ofrece a sus propias funciones de formato UTF: MultiByteToWideChar y WideCharToMultiByte.

//UTF8 to UTF16 
std::string input = ... 
int utf16len = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
               NULL, 0); 
std::wstring output(utf16len); 
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), input.size(), 
           &output[0], output.size()); 
//UTF16 to UTF8 
std::wstring input = ... 
int utf8len = WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
               NULL, 0, NULL, NULL); 
std::string output(utf8len); 
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), input.size(), 
           &output[0], output.size(), NULL, NULL); 
+0

Hunter: tenga en cuenta que Windows no viene con iconv, pero hay formas de obtenerlo. @Dreamlax: ¿Te importa si insertamos mi respuesta en la tuya como una alternativa de Windows y elimino la mía? El concepto de usar una biblioteca es el correcto, y el tuyo es más claro al respecto. –

+0

@MooingDuck: Sí, absolutamente, parece una buena idea. Pon el mío en el tuyo o el tuyo en el mío, cualquiera que sea. – dreamlax

+1

@MooingDuck: Hmmm ... no sonaba bien cuando dije eso ... – dreamlax