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);