wie wstring zu string konvertieren?
-
wie kann ich das machen? gibt es da fertige funktionen oder sowas?
-
wenn du nicht gleichzeitig UTF-16 in UTF-8 konvertieren möchtest geht das einfach so:
std::wstring myWstring = ...;
std::string myString (myWstring.begin(), myWstring.end());
-
Wenn ich von so einem Fall ausgehe:
void myStringFunction(std::string &in) { // do something } int main() { std::wstring w_str = L"my string"; std::string s_str(w_str.begin(), w_str.end()); myStringFunction(s_str); }Das Problem dabei ist doch, dass die Größe des Strings die gleiche bleibt.
Das heißt am Ende habe ich bei meinem std::stringw_str.size() / 2überflüssig belegten Speicher, oder nicht?
-
der std::string hat nach der Umwandlung dieselbe Anzahl Zeichen, aber nicht dieselbe Anzahl Bytes.
noch der Hinweis: unter Windows ist meist sizeof(wchar_t)==2, unter Linux&Co. ist meist sizeof(wchar_t)==4
-
Also bei mir (Windows 8 64bit) hat der std::string die selbe Anzahl Bytes.
Ich muss dann dass hier machen, damit ich wieder was vernünftiges habe:void myStringFunction(std::string &in) { // do something } int main() { std::wstring w_str = L"my string"; std::string s_str(w_str.begin(), w_str.end()); s_str.resize(s_str.size() / 2); myStringFunction(s_str); }Wieso das so ist verstehe ich nicht wirklich

-
Warum willst du überhaupt konvertieren? Du verlierst dadruch ja Informationen bzw. der string wird ein anderer.
-
der Konstruktor, der hier verwendet wird, ist der Template-Konstruktor ganz am Ende der Liste, deshalb geht das sowohl mit std::string als auch mit std::wstring
http://www.cplusplus.com/reference/string/string/string/
das Beispiel geht bei mir mit VC++ 2010 ohne Probleme durch
#include <string> int main () { std::wstring myWstring = L"12345"; std::string myString (myWstring.begin(), myWstring.end()); printf ("%d %d \"%s\"\n", (unsigned)myString.length(), (unsigned)myString.size(), myString.c_str()); return 0; }Ausgabe:
5 5 "12345"
-
std::string::size() gibst du die Länge des Strings an und nicht die Bytegröße.
Ob du nun 10 Buchstaben mit je 2 Bytes oder 10 mit je 1 Byte macht keinen Unterschied, denn es bleiben immer 10 Zeichen.
-
bei std::string/std::wstring ist size() und length() dasselbe, wobei size() bei std::wstring etwas irreführend ist ... nunja
von mir noch die Ergänzung: wie ich oben schon geschrieben habe, wird bei dieser Konvertierung aus einem wchar_t ein char, ohne Berücksichtigung einer evtl. UTF Kodierung, d.h. das geht nur mit ASCII, Latin-1, ISO 8859-1, Windows-1252 usw.
hier der Test mit dem UTF-16 EUR Zeichen:
#include <string> int main () { wchar_t wac1 [] = { /*a*/ 0x61, /*b*/ 0x62, /*c*/ 0x63, /*EuroSign*/ 0x20ac, /*x*/ 0x78, /*y*/ 0x79, /*z*/ 0x7a, 0 }; std::wstring myWstring = wac1; std::string myString (myWstring.begin(), myWstring.end()); printf ("%d \"%s\"\n", (unsigned)myString.length(), myString.c_str()); return 0; }Ausgabe:
7 "abc¼xyz"