L
est utilisé pour créer des littéraux wchar_t. De votre commentaire à propos de SafeArrayPutElement
et de la façon dont vous utilisez le terme «Unicode», il est clair que vous utilisez Windows. En supposant que ce char* string
est dans l'héritage encodage Windows est utilisé et non UTF-8 ou quelque chose (une hypothèse sûre sous Windows), vous pouvez obtenir une chaîne de wchar_t de la manière suivante:
// typical Win32 conversion in C
int output_size = MultiByteToWideChar(CP_ACP,0,string,-1,NULL,0);
wchar *wstring = malloc(output_size * sizeof(wchar_t));
int size = MultiByteToWideChar(CP_ACP,0,string,-1,wstring,output_size);
assert(output_size==size);
// make use of wstring here
free(wstring);
Si vous utilisez C++ vous pouvez faire cette exception en toute sécurité en utilisant std :: wstring à la place (ce qui utilise un tout petit peu de 11 C++ et ainsi peut nécessiter VS2010 ou au-dessus):
std::wstring ws(output_size,L'\0');
int size = MultiByteToWideChar(CP_ACP,0,string,-1,ws.data(),ws.size());
// MultiByteToWideChar tacks on a null character to mark the end of the string, but this isn't needed when using std::wstring.
ws.resize(ws.size() -1);
// make use of ws here. You can pass a wchar_t pointer to a function by using ws.c_str()
//std::wstring handles freeing the memory so no need to clean up
Voici une autre méthode qui utilise plus de Bibliothèque standard C++ (et tire parti du fait que le VS2010 n'est pas entièrement conforme aux normes):
#include <locale> // for wstring_convert and codecvt
std::wstring ws = std::wstring_convert<std::codecvt<wchar_t,char,std::mbstate_t>,wchar_t>().from_bytes(string);
// use ws.c_str() as before
Vous impliquez également dans les commentaires que vous avez essayé de convertir en wchar_t et avez la même erreur. Si c'est le cas lorsque vous essayez ces méthodes de conversion en wchar_t, l'erreur se situe ailleurs. Probablement dans le contenu réel de votre chaîne. Peut-être que ce n'est pas correctement terminé?
Quelle plateforme? Ou voulez-vous une bibliothèque portable Unicode? Et que voulez-vous dire par "Unicode"? Voulez-vous dire UTF-16? Quel est le format de la chaîne déjà? Si c'est de l'ASCII pur, il n'y a rien à faire, ASCII est un sous-ensemble d'unicode, donc si c'est ASCII, c'est unicode. –
merci pour la réponse éclair, ici mon besoin actuel est, j'utilise SafeArrayPutElement, et pour cette api le 3ème paramètre est un void *, dans mon cas, je veux passer la chaîne, donc si je passe directement la chaîne char * l'API échoue à dire hors de la mémoire. mais à des fins de test si j'utilise (L "ChkIt") fonctionne bien. alors comment 'L' (convertir en unicode) le contenu de la variable de chaîne TIA – Naveen
Donc, vous voulez convertir les caractères étroits en caractères larges? – tripleee