(Diese Frage wurde zufällig durchsucht. Es ist lange her, seit ich C ++ gemacht habe.) Die Standardbibliothek hat also keine std :: string -> std :: wstring-Konvertierung? Das scheint komisch; Gibt es einen guten Grund?
Domenic
5
Wenn Sie std :: vector <wchar_t> verwenden, um Speicher für buf zu erstellen, wird Ihr temporärer Puffer freigegeben, wenn irgendetwas eine Ausnahme auslöst.
Jason Harrison
81
Grund # 233, warum C ++ mich verdammt nervt..10 Codezeilen für eine einfache String-Konvertierung = /
b1nary.atr0phy
2
Oder sagen Sie einfach wstring ws (s.begin (), s.end ()) ...?
CJBrew
3
@CJBrew: Für jedes Problem gibt es eine Lösung, die sauber, elegant und falsch ist. Ihre basiert auf der Annahme, dass Ihre Eingabe nur ASCII-Zeichen ( nicht ANSI-Zeichen) enthält.
Unsichtbarer
121
Die Lösung ist tatsächlich viel einfacher als alle anderen Vorschläge:
Sorry Benny, aber das funktioniert bei mir nicht, Torans eigene Lösung scheint aber gut zu funktionieren (aber ... blöd!).
Iain Collins
32
Dies funktioniert nur, wenn alle Zeichen Einzelbyte sind, dh ASCII oder ISO-8859-1 . Alles, was mit mehreren Bytes zu tun hat, schlägt kläglich fehl, einschließlich UTF-8.
Mark Ransom
Ich glaube, Sie können die erste Zeile vereinfachen, um: std :: wstring stemp (s.begin (), s.end ()); Das würde eine mögliche Kopie eliminieren und einfacher aussehen; Beachten Sie, dass der Compiler die Kopie möglicherweise trotzdem entfernt, dies jedoch immer noch einfacher aussieht.
Kit10
13
Herr, was ist mit all den Gegenstimmen? Diese Antwort funktioniert manchmal nur durch Zufall. Zeichenkodierungen werden vollständig ignoriert . Sie können ein schmales Zeichen nicht einfach erweitern und hoffen, dass es sich auf magische Weise in ein breites Zeichen verwandelt, das denselben Codepunkt darstellt. Es ist das moralische Äquivalent von a reinterpret_cast. Dieser Code funktioniert nicht. Verwende nicht. .
Unsichtbarer
2
@nik: Unter Windows wird a charnormalerweise als ANSI codiert. Bei der ANSI-Codierung werden die Werte 128 bis 255 unter Verwendung der aktuell aktiven Codepage interpretiert. Wenn Sie diese Werte in eine wchar_t(UTF-16-Codierung unter Windows) verschieben, wird das gewünschte Ergebnis nicht erzielt . Wenn Sie genau sein möchten, funktioniert dies in genau 50% der Fälle. Unter Berücksichtigung der DBCS-Zeichenkodierung nimmt dieser Prozentsatz weiter ab.
Unsichtbarer
9
Wenn Sie sich in einer ATL / MFC-Umgebung befinden, können Sie das ATL-Konvertierungsmakro verwenden:
Sie können dann unicodeStr als LPCWSTR verwenden. Der Speicher für die Unicode-Zeichenfolge wird auf dem Stapel erstellt und freigegeben. Anschließend wird der Destruktor für unicodeStr ausgeführt.
Antworten:
Vielen Dank für den Link zum MSDN-Artikel. Genau das habe ich gesucht.
quelle
Die Lösung ist tatsächlich viel einfacher als alle anderen Vorschläge:
Das Beste ist, dass es plattformunabhängig ist. h2h :)
quelle
reinterpret_cast
. Dieser Code funktioniert nicht. Verwende nicht. .char
normalerweise als ANSI codiert. Bei der ANSI-Codierung werden die Werte 128 bis 255 unter Verwendung der aktuell aktiven Codepage interpretiert. Wenn Sie diese Werte in einewchar_t
(UTF-16-Codierung unter Windows) verschieben, wird das gewünschte Ergebnis nicht erzielt . Wenn Sie genau sein möchten, funktioniert dies in genau 50% der Fälle. Unter Berücksichtigung der DBCS-Zeichenkodierung nimmt dieser Prozentsatz weiter ab.Wenn Sie sich in einer ATL / MFC-Umgebung befinden, können Sie das ATL-Konvertierungsmakro verwenden:
Sie können dann unicodeStr als LPCWSTR verwenden. Der Speicher für die Unicode-Zeichenfolge wird auf dem Stapel erstellt und freigegeben. Anschließend wird der Destruktor für unicodeStr ausgeführt.
quelle
Anstelle eines std :: string können Sie auch einen std :: wstring verwenden.
EDIT: Sorry, das ist nicht erklärender, aber ich muss laufen.
Verwenden Sie std :: wstring :: c_str ()
quelle
quelle
LPCWSTR lpcwName = std :: wstring (strname.begin (), strname.end ()). C_str ()
quelle