web-dev-qa-db-fra.com

Je veux convertir std :: string en un const wchar_t *

Y a-t-il une méthode? Mon ordinateur est AMD64.

::std::string str;
BOOL loadU(const wchar_t* lpszPathName, int flag = 0);

Quand j'ai utilisé:

loadU(&str);

le compilateur VS2005 dit:

Error 7 error C2664:: cannot convert parameter 1 from 'std::string *__w64 ' to 'const wchar_t *'

Comment puis-je le faire?

53
user25749

Si vous avez un objet std :: wstring, vous pouvez appeler c_str() dessus pour obtenir un wchar_t*:

std::wstring name( L"Steve Nash" );
const wchar_t* szName = name.c_str();

Cependant, comme vous utilisez une chaîne étroite, vous devez d'abord l'élargir. Il existe différentes options ici; la première consiste à utiliser la routine intégrée MultiByteToWideChar de Windows. Cela vous donnera un LPWSTR, ce qui équivaut à wchar_t*.

41
Matt Dillard

Convertissez-le d'abord en std :: wstring:

std::wstring widestr = std::wstring(str.begin(), str.end());

Obtenez ensuite la chaîne C:

const wchar_t* widecstr = widestr.c_str();

Cela ne fonctionne que pour les chaînes ASCII, mais cela ne fonctionnera pas si la chaîne sous-jacente est encodée en UTF-8. L'utilisation d'une routine de conversion comme MultiByteToWideChar () garantit que ce scénario est géré correctement.

90
marijne

Vous pouvez utiliser les macros de conversion de texte ATL pour convertir une chaîne étroite (char) en une chaîne large (wchar_t). Par exemple, pour convertir une chaîne std :::

#include <atlconv.h>
...
std::string str = "Hello, world!";
CA2W pszWide(str.c_str());
loadU(pszWide);

Vous pouvez également spécifier une page de codes, donc si votre chaîne std :: contient des caractères UTF-8, vous pouvez utiliser:

CA2W pszWide(str.c_str(), CP_UTF8);

Très utile mais Windows uniquement.

9
Rob

Si vous êtes sous Linux/Unix, jetez un œil à mbstowcs () et wcstombs () définis dans GNU C (d'après ISO C 90).

  • mbs signifie "Multi Bytes String" et est fondamentalement la chaîne C terminée par zéro habituelle.

  • wcs signifie Wide Char String et est un tableau de wchar_t.

Pour plus de détails sur les caractères larges, consultez la documentation de la glibc ici .

4
kriss