UTF8 Decoding



  • Die Funktion wird im Programm noch garnicht aufgerufen weil ich ja immernoch dabei bin sie erstmal richtig hinzukriegen.

    CString DecodeUTF8(CString UTF8Text)
    {
        TCHAR m[strlen(UTF8Text)]; // ERROR
        WCHAR w[500];
        strcpy(m, UTF8Text);
        MultiByteToWideChar(CP_UTF8, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
        WideCharToMultiByte(CP_ACP, 0, w, -1, m, sizeof(m), 0, 0);
        CString AnsiText = m;
        return AnsiText;
    }
    

    Und genau das verursacht die zuvor genannten Errors.
    Wenn ich es aber als TCHAR m[500] mach hat der Kompiler keine Probleme damit.



  • Ok Problem gelöst 👍

    CString DecodeUTF8(CString UTF8Text)
    {
        TCHAR* m = new TCHAR[strlen(UTF8Text)];
    	WCHAR* w = new WCHAR[strlen(UTF8Text)];
        strcpy(m, UTF8Text);
        MultiByteToWideChar(CP_UTF8, 0, m, -1, w, strlen(m));
        WideCharToMultiByte(CP_ACP, 0, w, -1, m, strlen(m), 0, 0);
        CString AnsiText = m;
        return AnsiText;
    }
    

    Vielen Dank Leute 😃



  • man kann auch die benötigte stringlänge abfrangen indem man die output buffer größe auf 0 setzt. das halte ich für besser.



  • In meinem Artikel das Beispiel ganz unten...
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html



  • Wo viel "new" ist sollte auch viel "delete" sein.
    Nimm als Buffer doch einfach 2 Vektoren.
    So wie du das derzeit hast wird es leaken, da die beiden angeforderten Buffer nie freigegeben werden.



  • hustbaer schrieb:

    Wo viel "new" ist sollte auch viel "delete" sein.

    Meinst Du mich!? Ok, hab ein Fehler im Fehlerfall rausgemacht 😉



  • mit std::vector wäre das nicht passiert



  • ist das nicht basiswissen wenn man einen speicher auf dem heap (new) resviert ihn dann auch mit delete wieder löscht??? 🙄

    mit std::vector wäre was nicht passiert 🕶



  • @Jochen Kalmbach: Nö, ich meinte dashier:
    (sorry, hätte es gleich quoten sollen)

    someone schrieb:

    Ok Problem gelöst 👍

    CString DecodeUTF8(CString UTF8Text)
    {
        TCHAR* m = new TCHAR[strlen(UTF8Text)];
    	WCHAR* w = new WCHAR[strlen(UTF8Text)];
        strcpy(m, UTF8Text);
        MultiByteToWideChar(CP_UTF8, 0, m, -1, w, strlen(m));
        WideCharToMultiByte(CP_ACP, 0, w, -1, m, strlen(m), 0, 0);
        CString AnsiText = m;
        return AnsiText;
    }
    

    Vielen Dank Leute 😃

    Und da ist garkein delete. *schauder*
    Und wieder bin ich an dem Punkt wo ich feststelle: std::auto_array fehlt doch, z.B. weil so viele Leute keinen std::vector verwenden, auch wenn es ginge 😃

    @LowFly: ja, schon Basiswissen, erzähl das mal "_someone_". 🙂



  • dieser someone hat ja wirklich überhaupt keinen plan. der frickelt sich alles zusammen.



  • als ich das ganze dann nochmal durchgeschaut hab, hatte ich das mit den deletes natürlich bemerkt 😛
    aber am Anfang übersieht man halt schnell mal dinge wie '*' oder delete 😉

    CString DecodeUTF8(CString UTF8Text)
    {
        TCHAR* m = new TCHAR[strlen(UTF8Text)+1];
        WCHAR* w = new WCHAR[strlen(UTF8Text)+1];
        strcpy(m, UTF8Text);
        MultiByteToWideChar(CP_UTF8, 0, m, -1, w, strlen(UTF8Text));
        WideCharToMultiByte(CP_ACP, 0, w, -1, m, strlen(UTF8Text), 0, 0);
        CString AnsiText = m;
        delete[] m; delete[] w;
        return AnsiText;
    }
    


  • [quote="_someone_"]

    TCHAR* m = new TCHAR[strlen(UTF8Text)+1];
        WCHAR* w = new WCHAR[strlen(UTF8Text)+1];
    

    Warum verwendest Du hier "strlen"??? ein CString hat eine Methode welche die Länge zurückliefert... "strlen" geht nur, wenn Du *nicht* mit UNICODE übersetzt...


Anmelden zum Antworten