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 deleteCString 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...