Wie kann ich ein std::string
in konvertieren LPCSTR
? Wie kann ich ein std::string
in konvertieren LPWSTR
?
Ich bin total verwirrt mit diesen LPCSTR
LPSTR
LPWSTR
und LPCWSTR
.
Sind LPWSTR
und LPCWSTR
das gleiche?
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 einconst char *
(LPCSTR
) von a zu erhaltenstd::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.
quelle
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.
Beachten Sie, dass Sie nicht versuchen sollten, so etwas zu tun.
Der von zurückgegebene Puffer
.c_str()
gehört derstd::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 einemLPWSTR
komplizierter ist. WennLPWSTR
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 derstd::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 mitMultiByteToWideChar
(einer Win32-API-Funktion) durchführen.z.B
quelle
Mit können
LPWSTR
Sie den Inhalt der Zeichenfolge dort ändern, wo sie zeigt. Mit könnenLPCWSTR
Sie den Inhalt der Zeichenfolge nicht ändern, auf die sie verweist.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 werdenLPWSTR
, sollten Sie eine Kopie der Originalzeichenfolge auf dem Heap erstellen. Überprüfen Sie das folgende Beispiel:quelle
Die
MultiByteToWideChar
Antwort, die Charles Bailey gab, ist die richtige. DaLPCWSTR
es sich nur um ein typedef für handeltconst WCHAR*
, kannwidestr
im Beispielcode überall dort verwendet werden, wo aLPWSTR
erwartet wird oder wo aLPCWSTR
erwartet wird.Eine kleine Änderung wäre die Verwendung
std::vector<WCHAR>
anstelle eines manuell verwalteten Arrays:Wenn Sie zunächst mit breiten Zeichenfolgen arbeiten müssen, können Sie
std::wstring
stattdessen anstelle von verwendenstd::string
. Wenn Sie mit dem Windows-TCHAR
Typ arbeiten möchten , können Sie verwendenstd::basic_string<TCHAR>
. Das Konvertieren vonstd::wstring
nachLPCWSTR
oder vonstd::basic_string<TCHAR>
nachLPCTSTR
ist nur eine Frage des Anrufsc_str
. Wenn Sie zwischen ANSI- und UTF-16-Zeichen wechseln, wird das BildMultiByteToWideChar
(und seine UmkehrungWideCharToMultiByte
) angezeigt.quelle
Die Konvertierung ist einfach:
std :: string str; LPCSTR lpcstr = str.c_str ();
quelle
Das Konvertieren ist einfach:
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.
quelle
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. denstd::string.begin()
und den.end()
Iterator. Dies konvertiert jedoch jedes Zeichen in einwchar_t
. Dies ist nur gültig, wenn dasstd::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.quelle
std::wstring
?myString ist die Eingabezeichenfolge und lpSTR ist das LPSTR- Äquivalent.
quelle