utf8 codificar caracteres c++ unicode utf-8 character-encoding utf-16

c++ - codificar - Cómo convertir cadena Unicode en una cadena utf-8 o utf-16?



utf-8 encoding (5)

Cómo convertir cadena Unicode en una cadena utf-8 o utf-16? Mi proyecto VS2005 usa un conjunto de caracteres Unicode, mientras que sqlite en cpp proporciona

int sqlite3_open( const char *filename, /* Database filename (UTF-8) */ sqlite3 **ppDb /* OUT: SQLite db handle */ ); int sqlite3_open16( const void *filename, /* Database filename (UTF-16) */ sqlite3 **ppDb /* OUT: SQLite db handle */ );

para abrir una carpeta. ¿Cómo puedo convertir string, CString o wstring en UTF-8 o UTF-16 charset?

¡Muchas gracias!


Todos los tipos de cadenas de C ++ son neutros en el conjunto de caracteres. Simplemente se conforman con el ancho de un personaje y no hacen más suposiciones. Un wstring usa caracteres de 16 bits en Windows, que corresponden aproximadamente a utf-16, pero aún depende de lo que almacene en el hilo. El wstring de ninguna manera exige que los datos que ingrese sean válidos utf16. Sin embargo, Windows usa utf16 cuando se define UNICODE, por lo que es probable que sus cadenas ya sean utf16, y no es necesario que haga nada.

Algunos otros han sugerido utilizar la función WideCharToMultiByte, que es (uno de) los modos de ir a convertir utf16 a utf8. Pero como sqlite puede manejar utf16, eso no debería ser necesario.


Use la función WideCharToMultiByte . Especifique CP_UTF8 para el parámetro CodePage .

CHAR buf[256]; // or whatever WideCharToMultiByte( CP_UTF8, 0, StringToConvert, // the string you have -1, // length of the string - set -1 to indicate it is null terminated buf, // output __countof(buf), // size of the buffer in bytes - if you leave it zero the return value is the length required for the output buffer NULL, NULL );

Además, la codificación predeterminada para las aplicaciones Unicode en Windows es UTF-16LE, por lo que es posible que no necesite realizar ninguna traducción y solo utilice la segunda versión sqlite3_open16 .


utf-8 y utf-16 son codificaciones de caracteres "unicode". De lo que probablemente hablas es de utf-32, que es una codificación de caracteres de tamaño fijo. Quizás buscando

"Convert utf-32 into utf-8 or utf-16"

le proporciona algunos resultados u otros documentos sobre esto.


Respuesta corta:

No se requiere conversión si usa cadenas Unicode como CString o wstring. Use sqlite3_open16 (). Tendrás que asegurarte de pasar un puntero WCHAR (casted to void * . Parece cojo. Incluso si esta lib es multiplataforma, creo que podrían haber definido un tipo de char ancho que depende de la plataforma y es menos desagradable que un void * ) a la API. Como para un CString: (void*)(LPCWSTR)strFilename

La respuesta más larga:

No tiene una cadena Unicode que quiera convertir a UTF8 o UTF16. Usted tiene una cadena Unicode representada en su programa usando una codificación dada: Unicode no es una representación binaria per se. Las codificaciones dicen cómo los puntos de código Unicode (valores numéricos) se representan en la memoria (diseño binario del número). UTF8 y UTF16 son las codificaciones más utilizadas. Sin embargo, son muy diferentes.

Cuando un proyecto de VS dice "Juego de caracteres Unicode", en realidad significa que "los caracteres están codificados como UTF16". Por lo tanto, puede usar sqlite3_open16 () directamente. No se requiere conversión Los caracteres se almacenan en el tipo WCHAR (en lugar de char ) que toma 16 bits (retroceso en el tipo C estándar wchar_t , que toma 16 bits en Win32. Puede ser diferente en otras plataformas. Gracias por la corrección, Checkers).

Hay un detalle más al que le gustaría prestar atención: UTF16 existe en 2 sabores: Big Endian y Little Endian. Ese es el orden de bytes de estos 16 bits. El prototipo de función que proporcione para UTF16 no indica qué orden se utiliza. Pero estás bastante seguro asumiendo que sqlite usa el mismo endian-ness que Windows (Little Endian IIRC. Conozco el orden, pero siempre he tenido problemas con los nombres :-)).

EDITAR: Respuesta a los comentarios de las Damas:

UTF16 usa unidades de código de 16 bits. En Win32 (y solo en Win32), wchar_t se usa para dicha unidad de almacenamiento. El truco es que algunos caracteres Unicode requieren una secuencia de 2 de esas unidades de código de 16 bits. Se llaman Pares de Sustituto.

De la misma forma que un UTF8 representa 1 carácter usando una secuencia de 1 a 4 bytes. Sin embargo, UTF8 se usa con el tipo de caracteres.


La forma más sencilla de hacerlo es usar CStringA. La clase CString es un typedef para CStringA (versión ASCII) o CStringW (versión de char ancha). Ambas clases tienen constructores para convertir tipos de cadenas. Yo suelo usar:

sqlite3_open(CStringA(L"MyWideCharFileName"), ...);