Comment convertir jstring en wchar_t *
Disons que sur le C++ en parallèle à mes fonctions d'une variable de type jstring
nommé myString
. Je peux le convertir en une chaîne ANSI comme suit:
const char* ansiString = env->GetStringUTFChars(myString, 0);
est-il un moyen d'obtenir
const wchar_t* unicodeString =
...
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Si cela aide quelqu'un... j'ai utilisé cette fonction pour un projet Android:
Une meilleure solution pourrait être (Merci pour les commentaires):
Et qui libère wsz?
Je recommande STL!
Un portable et robuste solution est d'utiliser iconvavec la compréhension que vous devez savoir de quel encodage de votre système
wchar_t
utilise (UTF-16 sur Windows, UTF-32 sur de nombreux systèmes Unix, par exemple).Si vous souhaitez réduire votre dépendance à l'égard de la troisième partie du code, vous pouvez également la main-rouler vos propres UTF-8 converter. C'est facile si la conversion en UTF-32, un peu plus difficile avec l'encodage UTF-16, parce que vous avez à gérer les paires de substitution. 😛 Aussi, vous devez être attentif à rejeter non plus courte formes, ou cela peut ouvrir des failles de sécurité dans certains cas.
JNI a un GetStringChars() fonction. Le type de retour est const jchar*, jchar est de 16 bits sur win32, d'une manière qui soit compatible avec wchar_t. Vous ne savez pas si c'est réel, UTF-16 ou d'autre chose...
Je sais que cela a été demandé il y a un an, mais je n'aime pas les autres réponses je vais donc répondre de toute façon. Voici comment nous le faisons dans nos source:
MODIFIER: Cette solution fonctionne bien sur les plates-formes où wchar_t est de 2 octets, certaines plates-formes ont un 4 octets wchar_t dans ce cas, cette solution ne fonctionnera pas.
Si nous ne sommes pas intéressés par la croix-plate-forme-la capacité, dans windows, vous pouvez utiliser le MultiByteToWideChar fonction, ou les macros utiles A2W (réf. exemple).
Juste utiliser env->GetStringChars(myString, 0);
Java passe Unicode, de par leur nature
Plutôt simple. Mais ne pas oublier de libérer la mémoire par ReleaseStringChars