Antworten:
str.c_str()
gibt Ihnen ein const char *
, was ein LPCSTR
(langer Zeiger auf konstante STRing) ist - bedeutet, dass es ein Zeiger auf eine 0
abgeschlossene Zeichenfolge ist. W
bedeutet breite Zeichenfolge (zusammengesetzt aus wchar_t
statt char
).
Rufen Sie c_str()
an, um ein const char *
( LPCSTR
) von a zu erhalten std::string
.
Es ist alles im Namen:
LPSTR
- (langer) Zeiger auf String - char *
LPCSTR
- (langer) Zeiger auf konstante Zeichenfolge - const char *
LPWSTR
- (langer) Zeiger auf Unicode (breite) Zeichenfolge - wchar_t *
LPCWSTR
- (langer) Zeiger auf konstante Unicode (breite) Zeichenfolge - const wchar_t *
LPTSTR
- (langer) Zeiger auf TCHAR-Zeichenfolge (Unicode, wenn UNICODE definiert ist, ANSI, wenn nicht) - TCHAR *
LPCTSTR
- (langer) Zeiger auf konstante TCHAR-Zeichenfolge - const TCHAR *
Sie können den L-Teil (lange) der Namen ignorieren - dies ist ein Überbleibsel von 16-Bit-Windows.
Dies sind von Microsoft definierte Typedefs, die entsprechen:
LPCSTR: Zeiger auf nullterminierte const-Zeichenfolge von char
LPSTR: Zeiger auf nullterminierte Zeichenfolge von char
(häufig wird ein Puffer übergeben und als 'Ausgabe'-Parameter verwendet)
LPCWSTR: Zeiger auf eine nullterminierte Zeichenfolge von const wchar_t
LPWSTR: Zeiger auf eine nullterminierte Zeichenfolge von wchar_t
(häufig wird ein Puffer übergeben und als 'Ausgabe'-Parameter verwendet)
Das "Konvertieren" von a std::string
in einen LPCSTR hängt vom genauen Kontext ab, aber normalerweise ist ein Aufruf .c_str()
ausreichend.
Das funktioniert.
void TakesString(LPCSTR param);
void f(const std::string& param)
{
TakesString(param.c_str());
}
Beachten Sie, dass Sie nicht versuchen sollten, so etwas zu tun.
LPCSTR GetString()
{
std::string tmp("temporary");
return tmp.c_str();
}
Der von zurückgegebene Puffer .c_str()
gehört der std::string
Instanz und ist nur gültig, bis die Zeichenfolge das nächste Mal geändert oder zerstört wird.
So konvertiert ein std::string
zu einem LPWSTR
komplizierter ist. Wenn LPWSTR
Sie einen wünschen, müssen Sie einen modifizierbaren Puffer benötigen und sicher sein, dass Sie verstehen, welches Zeichen für die Codierung verwendetstd::string
wird. Wenn der std::string
eine Zeichenfolge mit der Standardcodierung des Systems enthält (hier unter der Annahme von Fenstern), können Sie die Länge des erforderlichen breiten Zeichenpuffers ermitteln und die Transcodierung mit MultiByteToWideChar
(einer Win32-API-Funktion) durchführen.
z.B
void f(const std:string& instr)
{
// Assumes std::string is encoded in the current Windows ANSI codepage
int bufferlen = ::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), NULL, 0);
if (bufferlen == 0)
{
// Something went wrong. Perhaps, check GetLastError() and log.
return;
}
// Allocate new LPWSTR - must deallocate it later
LPWSTR widestr = new WCHAR[bufferlen + 1];
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), widestr, bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// Do something with widestr
delete[] widestr;
}
Mit können LPWSTR
Sie den Inhalt der Zeichenfolge dort ändern, wo sie zeigt. Mit können LPCWSTR
Sie den Inhalt der Zeichenfolge nicht ändern, auf die sie verweist.
std::string s = SOME_STRING;
// get temporary LPSTR (not really safe)
LPSTR pst = &s[0];
// get temporary LPCSTR (pretty safe)
LPCSTR pcstr = s.c_str();
// convert to std::wstring
std::wstring ws;
ws.assign( s.begin(), s.end() );
// get temporary LPWSTR (not really safe)
LPWSTR pwst = &ws[0];
// get temporary LPCWSTR (pretty safe)
LPCWSTR pcwstr = ws.c_str();
LPWSTR
ist nur ein Zeiger auf die ursprüngliche Zeichenfolge. Sie sollten es nicht mit dem obigen Beispiel von der Funktion zurückgeben. Um nicht vorübergehend zu werden LPWSTR
, sollten Sie eine Kopie der Originalzeichenfolge auf dem Heap erstellen. Überprüfen Sie das folgende Beispiel:
LPWSTR ConvertToLPWSTR( const std::string& s )
{
LPWSTR ws = new wchar_t[s.size()+1]; // +1 for zero at the end
copy( s.begin(), s.end(), ws );
ws[s.size()] = 0; // zero at the end
return ws;
}
void f()
{
std::string s = SOME_STRING;
LPWSTR ws = ConvertToLPWSTR( s );
// some actions
delete[] ws; // caller responsible for deletion
}
Die MultiByteToWideChar
Antwort, die Charles Bailey gab, ist die richtige. Da LPCWSTR
es sich nur um ein typedef für handelt const WCHAR*
, kann widestr
im Beispielcode überall dort verwendet werden, wo a LPWSTR
erwartet wird oder wo a LPCWSTR
erwartet wird.
Eine kleine Änderung wäre die Verwendung std::vector<WCHAR>
anstelle eines manuell verwalteten Arrays:
// using vector, buffer is deallocated when function ends
std::vector<WCHAR> widestr(bufferlen + 1);
::MultiByteToWideChar(CP_ACP, 0, instr.c_str(), instr.size(), &widestr[0], bufferlen);
// Ensure wide string is null terminated
widestr[bufferlen] = 0;
// no need to delete; handled by vector
Wenn Sie zunächst mit breiten Zeichenfolgen arbeiten müssen, können Sie std::wstring
stattdessen anstelle von verwenden std::string
. Wenn Sie mit dem Windows- TCHAR
Typ arbeiten möchten , können Sie verwenden std::basic_string<TCHAR>
. Das Konvertieren von std::wstring
nach LPCWSTR
oder von std::basic_string<TCHAR>
nach LPCTSTR
ist nur eine Frage des Anrufs c_str
. Wenn Sie zwischen ANSI- und UTF-16-Zeichen wechseln, wird das Bild MultiByteToWideChar
(und seine Umkehrung WideCharToMultiByte
) angezeigt.
Das Konvertieren ist einfach:
std::string myString;
LPCSTR lpMyString = myString.c_str();
Hier ist zu beachten, dass c_str keine Kopie von myString zurückgibt, sondern nur einen Zeiger auf die Zeichenfolge, die std :: string umschließt. Wenn Sie eine Kopie möchten / benötigen, müssen Sie diese selbst mit strcpy erstellen.
Der einfachste Weg, a std::string
in a umzuwandeln , LPWSTR
ist meiner Meinung nach:
std::string
in astd::vector<wchar_t>
wchar_t
im Vektor.std::vector<wchar_t>
hat einen ctor mit Vorlagen, der zwei Iteratoren benötigt, z. B. den std::string.begin()
und den .end()
Iterator. Dies konvertiert jedoch jedes Zeichen in ein wchar_t
. Dies ist nur gültig, wenn das std::string
ASCII oder Latin-1 enthält, da Unicode-Werte Latin-1-Werten ähneln. Wenn es CP1252 oder Zeichen aus einer anderen Codierung enthält, ist es komplizierter. Sie müssen dann die Zeichen konvertieren.
std::wstring
?