Comment convertir une chaîne Unicode en utf-8 ou utf-16 de la chaîne?
Comment convertir une chaîne Unicode en utf-8 ou utf-16 de la chaîne?
Mon VS2005 projet est l'utilisation d'Unicode char, tandis que sqlite dans le rpc offre
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 */
);
pour l'ouverture d'un dossier.
Comment puis-je convertir chaîne, CString, ou wstring en UTF-8 ou UTF-16 charset?
Merci beaucoup!
Vous devez vous connecter pour publier un commentaire.
Réponse courte:
Aucune conversion n'est nécessaire que si vous utilisez des chaînes Unicode, tels que CString ou wstring. Utilisation sqlite3_open16().
Vous devrez assurez-vous de passer un WCHAR pointeur (coulé à
void *
. Semble boiteux! Même si cette lib est multi plate-forme, je suppose qu'ils pourraient avoir défini une échelle de type char qui dépend de la plate-forme et est moins hostile quevoid *
) à l'API. Comme pour une CString:(void*)(LPCWSTR)strFilename
La plus longue réponse:
Vous n'avez pas une chaîne Unicode que vous souhaitez convertir en UTF8 ou UTF16. Vous avez une chaîne Unicode représentées dans votre programme à l'aide d'un codage donnée: l'Unicode n'est pas une représentation binaire en soi. Les codages de dire comment les points de code Unicode (valeurs numériques) sont représentés en mémoire (mise en page binaire du nombre). UTF8 et UTF16 sont les plus largement utilisés des codages. Ils sont très différents si.
Lorsqu'un VS projet dit "jeu de caractères Unicode", cela signifie en fait "les caractères sont codés comme UTF16". Par conséquent, vous pouvez utiliser sqlite3_open16() directement. Aucune conversion n'est nécessaire. Les caractères sont stockés dans WCHAR type (par opposition à
char
) qui tient sur 16 bits (Fallsback sur la norme de type Cwchar_t
, qui prend en 16 bits sur Win32. Peut-être différent sur d'autres plates-formes. Merci pour la correction, Dames).Il y a un plus de détail que vous pourriez voulez faire attention à: UTF16 existe en 2 versions: Big Endian et Little-Endian. C'est l'octet de commande de ces 16 bits. Le prototype de fonction vous donner pour UTF16 ne veut pas dire lequel la commande est utilisée. Mais vous êtes assez sûr en supposant que sqlite utilise le même endian-ness que Windows (Little Endian IIRC. Je sais que l'ordre, mais j'ai toujours eu de problème avec les noms 🙂 ).
EDIT: Réponse au commentaire de Pions:
UTF16 utilise 16 bits unités de code. Sous Win32 (et seulement sur Win32),
wchar_t
est utilisé pour le stockage telle unité. Le truc, c'est que certains caractères Unicode exigent une séquence de 2 à 16 bits unités de code. Ils sont appelés les Paires de Substitution.De la même manière UTF8 représente 1 caractère à l'aide d'un 1 à 4 octets de la séquence. Encore UTF8 sont utilisés avec la
char
type.Utiliser le WideCharToMultiByte fonction. Spécifier
CP_UTF8
pour laCodePage
paramètre.Aussi, l'encodage par défaut pour l'unicode des applications dans windows est UTF-16LE, de sorte que vous ne pourriez pas besoin d'effectuer une traduction, et il suffit d'utiliser la deuxième version
sqlite3_open16
.Tous le C++ types de chaînes sont charset neutre. Ils suffit de les régler sur une largeur de caractère, et à ne plus faire des hypothèses. Un wstring utilise des caractères 16 bits dans Windows, correspondant en gros à l'utf-16, mais il dépend toujours de ce que vous stockez dans le fil. Le wstring n'est pas en aucune façon assurer que les données que vous mettez en elle doit être valide utf16. Windows utilise utf16 lors de l'UNICODE est définie, donc plus probable que vos chaînes sont déjà utf16, et vous n'avez pas besoin de faire quoi que ce soit.
Quelques autres ont suggéré d'utiliser l'WideCharToMultiByte fonction, qui est (l'une des) moyen(s) pour aller à convertir utf16 en utf8. Mais depuis sqlite peut gérer utf16, qui ne devrait pas être nécessaire.
utf-8 et utf-16 sont à la fois "unicode" encodages de caractères. Ce que vous avez probablement parler, c'est de l'utf-32, qui est un de taille fixe l'encodage des caractères. Peut-être à la recherche pour
"Convert utf-32 into utf-8 or utf-16"
vous fournit quelques résultats ou d'autres documents à ce sujet.
La façon la plus simple pour ce faire est d'utiliser CStringA. La classe CString est un typedef pour CStringA (version ASCII) ou CStringW (large char version). Ces deux classes ont les constructeurs pour convertir des types de chaînes. Je l'utilise généralement: