Respuesta corta:
sin necesidad de conversión si utiliza cadenas Unicode como CString o wstring. Use sqlite3_open16(). Tendrás que asegurarte de pasar un puntero WCHAR (casted a void *
. Parece cojo! Incluso si esta lib es multiplataforma, supongo que podrían haber definido un tipo de caracteres amplio que depende de la plataforma y es menos desagradable que un void *
) a la API. Por ejemplo para un CString: (void*)(LPCWSTR)strFilename
La respuesta larga:
Usted no tiene una cadena Unicode que desea 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 VS dice "Juego de caracteres Unicode", en realidad significa "caracteres codificados como UTF16". Por lo tanto, puede usar sqlite3_open16() directamente. No se requiere conversión Los caracteres se almacenan en tipo WCHAR (a diferencia de char
) que toma 16 bits (Retroceso en el estándar C tipo 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 que puede que desee 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 :-)).
EDIT: respuesta al comentario de Damas:
UTF16 utiliza 16 bits unidades de código. En Win32 (y solo en Win32), wchar_t
se utiliza 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 con una secuencia de 1 a 4 bytes. Sin embargo, UTF8 se usa con el tipo char
.
¡No, no, no! sqlite3_open16() usa el argumento 'void *', porque se dice que es UTF16, * NOT * wchar_t, que es de diferente tamaño en diferentes plataformas y puede o no ser UTF16 (es decir, glibc tiene 4-byte wchar_t). –
Damas: vea mi respuesta como EDITAR aquí arriba –
Sí, conozco la representación UTF16. Sin embargo, no puede suponer que la representación interna de wchar_t sea la misma en todas las plataformas, no lo es. –