UTF8 Decoding



  • Hallo
    Ich bin gerade dabei eine UTF8 Decoding Funktion zu schreiben (zB. hähä -> hähä). Sie läuft auch soweit, jedoch ist sie von einem Array abhängig, sodass die Funktion fehl schlägt, sobald der zu dekodierende String länger als das Array ist. Meine Frage ist, wie man das ganze ohne Array lösen kann, oder zumindest dem Array automatisch die entsprechende größe zuweisen kann (TCHAR m[strlen(UTF8Text)] funktioniert nämlich nicht).

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

    Danke schon mal für eure Hilfe 🙂



  • wie wäre es mit UTF8Text.GetLenght()

    wobei ich mir nicht vorstellen kann warum strlen nicht funzt schonmal mit

    char m = new char[strlen(UTF8Text)];
    char m = new char[strlen(UTF8Text)+1];

    versucht? 😉

    LowFly



  • strlen ist nur für den ANSI-Zeichensatz. Du musst lstrlen nehmen 😉 .

    EDIT: Oder das Äquivalent zu strlen ➡ wcslen.



  • 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



  • na dann wird dir irgendwann ein string an die funktion übergeben der die länge 0 hat prüf halt mal wieoft die funktion DecodeUTF8 ausgelöst wird und wie lang der übergeben String ist zb mit

    CString DecodeUTF8(CString UTF8Text)
    {
    CString f;
    f.Format("%i",UTF8Text.GetLenght());
    f.Format("%i",strlen(UTF8Text));
    MessageBox(f);
    }

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



  • 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