Wie konvertieren von CString und ::std::string ::std::wstring?
CString
ist ganz praktisch, während std::string
ist mehr kompatibel mit STL-container.
Ich bin mit hash_map
. Allerdings hash_map
nicht unterstützen CString
wie Schlüssel, so will ich konvertieren CString
in std::string
.
Schreiben Sie eine CString
hash-Funktion scheint zu viel Zeit in Anspruch nehmen.
CString -----> std::string
Wie kann ich dies tun?
std::string -----> CString:
inline CString toCString(std::string const& str)
{
return CString(str.c_str());
}
Habe ich Recht?
EDIT:
Sind hier noch mehr Fragen:
Wie kann ich umwandeln wstring
CString
zu einander?
//wstring -> CString,
std::wstring src;
CString result(src.c_str());
//CString->wstring.
CString src;
::std::wstring des(src.GetString());
Ist es alle problem?
Wie kann ich umwandeln std::wstring
std::string
zu einander?
InformationsquelleAutor der Frage user25749 | 2008-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut CodeGuru:
CString
zustd::string
:ABER:
std::string
kann nicht immer ein Konstrukt aus einerLPCTSTR
. d.h. der code wird nicht für UNICODE-builds.Als
std::string
konstruieren kann nur vonLPSTR
/LPCSTR
Programmierer, die verwendet VC++ 7.x oder besser nutzen können conversion-Klassen wieCT2CA
als Vermittler.std::string
zuCString
: (Von Visual Studio CString FAQs...)CStringT
konstruieren kann sowohl aus Zeichen oder wide-character-Zeichenfolgen. d.h. Es kann konvertieren vonchar*
(d.h.LPSTR
) oder auswchar_t*
(LPWSTR
).In anderen Worten, char-Spezialisierung (
CStringT
), d.h.CStringA
wchar_t
-specilizationCStringW
undTCHAR
-SpezialisierungCString
konstruiert werden können, die entweder auschar
-oder wide-Zeichen,null terminated (null-Terminierung ist hier sehr wichtig)string Quellen.Lediglich IInspectable ändert die "null-termination" Teil in den Kommentaren:
InformationsquelleAutor der Antwort VonC
Lösen, die durch die Nutzung
std::basic_string<TCHAR>
stattstd::string
und es sollte funktionieren, unabhängig von Ihrem Charakter Einstellung.InformationsquelleAutor der Antwort OJ.
Es ist mehr effiziente konvertieren
CString
zustd::string
mit der Umwandlung, wo die Länge angegeben wird.In enge Schleife macht dies zu einer erheblichen performance-Verbesserung.
InformationsquelleAutor der Antwort Sal
Wenn Sie etwas mehr C++-like, das ist, was ich verwenden. Obwohl es hängt davon ab, Boost, der nur für Ausnahmen. Sie können ganz einfach entfernen Sie diese verlassen, es hängt nur von der STL und der
WideCharToMultiByte()
Win32-API-Aufruf.InformationsquelleAutor der Antwort thehouse
Dies ist ein follow-up zu Sal ' s Antwort, wo er/Sie die Lösung:
Dies ist nützlich, auch bei der Umwandlung einer nicht-typischen C-String in einen std::string
Einen Anwendungsfall für mich war es eine pre-allocated char-array (C-String), aber es ist nicht NUL beendet. (z.B. SHA-digest).
Diese syntax ermöglicht es mir, geben Sie die Länge des SHA-digest des char-array, so dass std::string nicht Aussehen für die abschließenden NUL-char, die möglicherweise oder möglicherweise nicht vorhanden.
Wie:
InformationsquelleAutor der Antwort Neil
Dieser gut funktioniert:
InformationsquelleAutor der Antwort freeze
aus diesem post (Danke Mark Lösegeld )
Umwandeln von CString string (VC6)
Habe ich getestet und es funktioniert einwandfrei.
InformationsquelleAutor der Antwort Pat. ANDRIA
(Seit VS2012 ...und mindestens bis VS2017 v15.8.1)
Da es ein MFC-Projekt - & CString ist eine MFC-Klasse, bietet MS ein Technischer Hinweis TN059: Verwenden von MFC MBCS/Unicode-Konvertierung von Makros und Generische Makros für die Konvertierung:
Verwenden:
--
Fußnoten:
(1) um für die Konvertierung von Makros zu haben, Platz zum speichern der temporären Länge, ist es notwendig, deklarieren Sie eine lokale variable namens
_convert
das dies tut, in jeder Funktion verwendet, die die Konvertierung von Makros. Dies geschieht durch aufrufen derUSES_CONVERSION
makro. In VS2017 MFC-code (atlconv.h) sieht es wie folgt aus:InformationsquelleAutor der Antwort Amit G.
Funktioniert bei mir:
InformationsquelleAutor der Antwort user5546107
Alle anderen Antworten nicht so ganz ansprechen, was ich suchte, das war zu konvertieren
CString
on-the-fly im Gegensatz zum speichern das Ergebnis in einer Variablen.Die Lösung ist ähnlich wie oben, aber wir müssen einen Schritt mehr zu instanziieren, eine namenlose Objekt. Ich stehe hier mit einem Beispiel. Hier ist meine Funktion, die Bedürfnisse
std::string
aber ich habeCString
.Wie Sie es nennen, wenn Sie eine
CString
?Beachten Sie, dass die Letzte Zeile ist nicht direkt festgelegt, sondern wir schaffen eine namenlose
std::string
Objekt und Versorgung derCString
über seinen Konstruktor.InformationsquelleAutor der Antwort zar
Gibt es mehrere Probleme:
CString
ist eine template-Spezialisierung CStringT. Je nach BaseType Beschreibung der Charakter-Typ gibt es zwei konkrete Schwerpunkte:CStringA
(mitchar
) undCStringW
(mitwchar_t
).wchar_t
auf Windows ist ubiquitär verwendet zum speichern von UTF-16-codierte code-Einheiten, mitchar
ist mehrdeutig. Die letzteren Häufig speichert ANSI-codierte Zeichen, kann aber auch zum speichern von ASCII -, UTF-8, oder, auch binäre Daten.CString
(gesteuert durch die_UNICODE
Präprozessor-symbol), so dass die Frage nicht eindeutig. Wir wissen auch nicht, die gewünschte Zeichencodierungstd::string
.Um diese Probleme anzugehen, gehe ich davon aus, dass
wchar_t
speichern UTF-16 codierte code-Einheiten, undchar
halten UTF-8-Oktett-Sequenzen. Das ist die einzige vernünftige Wahl, die Sie vornehmen können, um sicherzustellen, dass Quell-und Ziel-strings behalten die gleichen Informationen, ohne Einschränkung der Lösung auf eine Teilmenge der Quell-oder Ziel-domains.Den folgenden Implementierungen der Konvertierung zwischen
CStringA
/CStringW
undstd::wstring
/std::string
Zuordnung von UTF-8 nach UTF-16 und Umgekehrt:Den verbleibenden zwei Funktionen konstruieren, die C++ string-Objekte, die von MFC-strings, verlassen die Codierung unverändert. Beachten Sie, dass während die früheren Funktionen nicht zurechtkommen mit embedded NUL-Zeichen, diese Funktionen sind immun gegen diese.
InformationsquelleAutor der Antwort IInspectable
Wenn Sie schauen, um zu konvertieren leicht zwischen anderen Saiten-Typen, die vielleicht
_bstr_t
Klasse wäre besser geeignet? Es unterstützt Konvertierung zwischenchar
wchar_t
undBSTR
.InformationsquelleAutor der Antwort OJ.
Ein interessanter Ansatz ist die Besetzung
CString
zuCStringA
innerhalb einerstring
Konstruktor. Im Gegensatz zustd::string s((LPCTSTR)cs);
dies funktioniert auch, wenn_UNICODE
definiert ist. Allerdings, wenn das der Fall ist, dies führt Konvertierung von Unicode zu ANSI, so ist es unsicher für die höhere Unicode-Werte außerhalb des ASCII-Zeichensatzes. Eine solche Umwandlung ist vorbehaltlich der_CSTRING_DISABLE_NARROW_WIDE_CONVERSION
Präprozessor-definition. https://msdn.microsoft.com/en-us/library/5bzxfsea.aspxInformationsquelleAutor der Antwort u8it