UTF8 Decoding



  • someone schrieb:

    CString DecodeUTF8(CString UTF8Text)
    {
        TCHAR m[lstrlen(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;
    }
    

    Bei strlen(...), lstrlen(...) und auch ...GetLength() krieg ich folgende Errors vom Kompiler gemeldet:

    error C2057: expected constant expression
    error C2466: cannot allocate an array of constant size 0
    error C2133: 'm' : unknown size
    error C2070: illegal sizeof operand

    Das KANN auch so NICHT funktionieren, da du hier:

    TCHAR m[[b]lstrlen(UTF8Text)[/b]]; // ERROR
    

    NUR Konstanten übergeben kannst!
    _______________________________________

    LowFly schrieb:

    New Edit;
    ferner würde ich es wenn schon so machen
    TCHAR m = new TCHAR[strlen(UTF8Text)];

    Die Syntax zur dynamischen Speicherreservierung ist (optionales ist kursiv):

    Type* pName = new Type[i][Anzahl]()[/i];
    

    Bei dir fehlt der '*' am Anfang 😉



  • jepp stimmt mein fehler 🙄



  • 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