2012-01-12 6 views
1

J'ai une chaîne dans une variable et cette chaîne provient de la partie centrale du projet. Maintenant, je veux convertir cela en chaîne unicode. Comment puis-je faire cela et l'ajout de L ou _T() ou TEXT() n'est pas une option. Pour mieux faire chose claire s'il vous plaît voir ci-dessousconvertir une chaîne en Unicode en C

Void foo(char* string) { 
    //Here the contents of the variable STRING should be converted to Unicode 
    //The soln should be possible to use in C code. 
} 

TIA Naveen

+4

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. –

+0

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

+0

Donc, vous voulez convertir les caractères étroits en caractères larges? – tripleee

Répondre

1

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é?

+0

Salut Bames, merci pour la réponse, fonctionne parfaitement ... encore merci beaucoup – Naveen

0

Vous ne pouvez pas dire "converti en Unicode". Vous devez spécifier un codage , Unicode n'est pas un encodage mais (grosso modo) un jeu de caractères et un ensemble de codages pour exprimer ces caractères comme des séquences d'octets.

De même, vous devez spécifier le codage d'entrée, par exemple, un caractère tel que "å" codé en string?

Questions connexes