Domanda

Esiste un metodo? Il mio computer è AMD64.

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

Quando ho usato:

loadU(&str);

il compilatore VS2005 dice:

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

Come posso farlo?

È stato utile?

Soluzione

Se hai un oggetto std :: wstring, puoi chiamare c_str () per ottenere un wchar_t * :

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

Dato che stai operando su una stringa stretta, tuttavia, devi prima allargarla. Ci sono varie opzioni qui; uno è utilizzare il Routine MultiByteToWideChar . Questo ti darà un LPWSTR , che equivale a wchar_t * .

Altri suggerimenti

Innanzitutto convertilo in std :: wstring:

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

Quindi ottieni la stringa C:

const wchar_t* widecstr = widestr.c_str();

Funziona solo con stringhe ASCII, ma non funzionerà se la stringa sottostante è codificata UTF-8. L'uso di una routine di conversione come MultiByteToWideChar () garantisce che questo scenario sia gestito correttamente.

Puoi utilizzare le macro di conversione del testo ATL per convertire una stringa stretta (char) in una stringa larga (wchar_t). Ad esempio, per convertire uno std :: string:

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

Puoi anche specificare una tabella codici, quindi se la tua std :: string contiene caratteri UTF-8 puoi usare:

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

Molto utile ma solo Windows.

Se sei su Linux / Unix dai un'occhiata a mbstowcs () e wcstombs () definiti in GNU C (da ISO C 90).

  • mbs sta per " Stringa multi byte " ed è sostanzialmente la solita stringa C con terminazione zero.

  • wcs sta per Wide Char String ed è un array di wchar_t.

Per maggiori dettagli di base su caratteri ampi, dai un'occhiata alla documentazione di glibc qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top