wchar_t example c++ character-encoding wchar-t

example - wchar_t c++



wchar_t y codificación (3)

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

Si quiero convertir un fragmento de cadena en UTF-16, diga char * xmlbuffer , ¿debo convertir el tipo a wchar_t * antes de codificar a UTF-16? ¿Y se requiere un tipo de char* antes de codificar a UTF-8?

¿Cómo está relacionado wchar_t , char con UTF-8 o UTF-16 o UTF-32 u otro formato de transformación?

¡Gracias de antemano por la ayuda!


No, no tienes que cambiar los tipos de datos.

Acerca de wchar_t : el estándar dice que

Escriba wchar_t es un tipo distinto cuyos valores pueden representar códigos distintos para todos los miembros del conjunto de caracteres ampliado más grande especificado entre las configuraciones regionales admitidas.

Lamentablemente, no dice qué codificación se supone que tiene wchar_t ; esto depende de la implementación. Entonces, por ejemplo, dado

auto s = L"foo";

no puede suponer en absoluto cuál es el valor de la expresión *s .

Sin embargo, puede usar 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.


iconv es una función POSIX que puede ocuparse del paso de codificación intermedio. Puede usar iconv_open para especificar que tiene entrada UTF-8 y que desea la salida UTF-16. Luego, usando el identificador devuelto por iconv_open , puedes usar iconv (especificando tu buffer de entrada y buffer de salida). Cuando hayas terminado, debes llamar a iconv_close en el identificador devuelto por iconv_open para liberar recursos, etc.

Tendrá que leer detenidamente la documentación de su sistema sobre qué codificaciones son compatibles con iconv y su esquema de nombres (es decir, qué proporcionar iconv_open ). Por ejemplo, iconv en algunos sistemas espera "utf-8" y otros puede esperar "UTF8" etc.

Windows no proporciona una versión de iconv y, en su lugar, proporciona 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);