UTF8 Decoding
- 
					
					
					
					
 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 operandDas KANN auch so NICHT funktionieren, da du hier: TCHAR m[[b]lstrlen(UTF8Text)[/b]]; // ERRORNUR 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... 
 
