236 votes

C ++ Convertir une chaîne (ou un caractère *) en chaîne (ou wchar_t *)

 string s = "おはよう";
wstring ws = FUNCTION(s, ws);
 

Comment pourrais-je assigner le contenu de s à ws?

Recherche Google et utilisé certaines techniques, mais ils ne peuvent pas attribuer le contenu exact. Le contenu est déformé.

302voto

Johann Gerell Points 10649

En supposant que la chaîne d'entrée soit une codage UTF-8 (qui, à mon sens, j'en doute fort :-)) d'une représentation d'une chaîne de votre intérêt, vous pouvez pleinement réaliser cela avec la bibliothèque standard seule:

 #include <locale>
#include <codecvt>
#include <string>

std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow = converter.to_bytes(L"foo");
std::wstring wide = converter.from_bytes("bar");
 

La raison de mon hypothèse UTF-8 est que ce n'est clairement pas ASCII, ANSI ou similaire.

59voto

Pietro M Points 472
int StringToWString(std::wstring &ws, const std::string &s)
{
    std::wstring wsTmp(s.begin(), s.end());

    ws = wsTmp;

    return 0;
}

42voto

Potatoswatter Points 70305

Votre question est sous-spécifiée. Strictement, cet exemple est une erreur de syntaxe. Cependant, mbstowcs est probablement ce que vous recherchez.

C'est une fonction C et fonctionne sur les tampons, vous aurez donc besoin de

 wchar_t buf[] = new wchar_t[ s.size() ];
size_t num_chars = mbstowcs( buf, s.c_str(), s.size() );
wstring ws( buf, num_chars );
delete[] buf;
 

EDIT: Mooing Duck suggère cet idiome:

 std::wstring ws(s.size(), L' '); // Overestimate number of code points.
ws.resize(mbstowcs(&ws[0], s.c_str(), s.size())); // Shrink to fit.
 

26voto

lmiguelmh Points 47

Si vous utilisez Windows/Visual Studio et la nécessité de convertir une chaîne de caractères à wstring vous devez utiliser:

#include <AtlBase.h>
#include <atlconv.h>
...
string s = "some string";
CA2W ca2w(s.c_str());
wstring w = ca2w;
printf("%s = %ls", s.c_str(), w.c_str());

Même procédure pour la conversion d'un wstring à chaîne (parfois, vous devez spécifier une page de codes):

#include <AtlBase.h>
#include <atlconv.h>
...
wstring w = L"some wstring";
CW2A cw2a(w.c_str());
string s = cw2a;
printf("%s = %ls", s.c_str(), w.c_str());

Vous pouvez spécifier une page de codes et même UTF8 (c'est assez agréable quand on travaille avec JNI/Java).

CA2W ca2w(str, CP_UTF8);

Si vous voulez en savoir plus sur les codes il y a un article intéressant sur Joel on Software: Le Minimum Absolu que Tout Développeur Doit Absolument, Positivement Savoir Sur Unicode et les Jeux de Caractères.

Ces CA2W (Convertir Ansi de Large=unicode) macros font partie de l' ATL et MFC Chaîne de Conversion les Macros, les échantillons inclus.

Parfois, vous devrez désactiver l'avertissement de sécurité #4995", je ne sais pas d'autre solution (pour moi, il se passera lorsque j'ai compilé pour WindowsXp dans VS2012).

#pragma warning(push)
#pragma warning(disable: 4995)
#include <AtlBase.h>
#include <atlconv.h>
#pragma warning(pop)

Edit: Ainsi, selon [cet article][3] l'article de Joel semble être: "tout en s'amusant, c'est assez léger sur les réels détails techniques". Article: [Ce Que Chaque Programmeur Absolument Besoin De Savoir À Propos De L'Encodage Et De Jeux De Caractères Pour Travailler Avec Du Texte][3].

19voto

Ghominejad Points 71

De char* à wstring :

 char* str = "hello worlddd";
wstring wstr (str, str+strlen(str));
 

De string à wstring :

 string str = "hello worlddd";
wstring wstr (str.begin(), str.end());
 

Notez que cela ne fonctionne que si la chaîne en cours de conversion ne contient que des caractères ASCII.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X