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::string

    w_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"
    

Anmelden zum Antworten