new WCHAR
-
Hallo,
ich versuche gerade utf8 in ansi umzuwandeln.Ich habe bisher mit folgender Funktion gearbeitet:
WCHAR w[512]; char m[512]; 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); utf8text = m;Als ich gerade einen längeren Text umwandeln wollte, habe ich nen Error erhalten, weil der Speicher des Arrays nicht gereicht hat. Also habe ich die Funktion so abgewandelt:
WCHAR w[512]; char *m = new char[utf8text.GetLength()+1]; 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); utf8text = m; delete[] m;Wenn ich WCHAR auch als dynamisches Array anlege:
WCHAR *w = new WCHAR[utf8text.GetLength()+1];funktioniert das nicht.
Ich hätte WCHAR aber auch gerne dynamisch.Wie geht das?
Danke
Miha
-
Was heißt "funktioniert nicht"? Bei dynamisch angelegten Arrays kannst du mit sizeof() nicht mehr die Größe des Arrays feststellen, da mußt du vorher wissen, wieviel Platz du hast (in dem Fall ist es einfach - die Größe des Feldes steht in utf8text.GetLength()).
-
Es geht nicht um eine nachträgliche Vergrößerung. Ich will die Größe gleich dynamisch anlegen, was aber nicht klappt.
Meldung:
Debug Error!
Programm: ...
DAMAGE: after Normal block (#524) at 0x00397080Press Retry ...
Bei folgendem Code kommt der Fehler:
char *m = new char[utf8text.GetLength()+1]; WCHAR *w = new WCHAR[utf8text.GetLength()+1]; 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); utf8text = m; delete[] m; delete[] w;Wenn ich WCHAR mit fester Größe 512 anlege, dann kommt kein Fehler.
Grüße,
Michael
-
Wenn ich statt
WCHAR *w = new WCHAR[utf8text.GetLength()+1];
das hier schreibe:
WCHAR *w = new WCHAR[512];
kommt der gleiche Fehler
-
Nochmal langsam - deine Art der Größenmessung (sizeof(w)/sizeof(WCHAR)) funktioniert nur für echte Arrays, bei Pointern liefert das nur Müll. Wie groß dein Speicher tatsächlich ist, weißt du aber auch ohne sizeof:
char *m = new char[utf8text.GetLength()+1]; WCHAR *w = new WCHAR[utf8text.GetLength()+1]; strcpy(m, utf8text);//Frage: Wozu dient das eigentlich? MultiByteToWideChar(CP_UTF8, 0, m, -1, w, utf8text.GetLength()+1); WideCharToMultiByte(CP_ACP, 0, w, -1, m, utf8text.GetLength()+1, 0, 0); utf8text = m; delete[] m; delete[] w;
-
Suuuuuuuper es klappt!
strcpy(m, utf8text); <= Damit wird der CString in das Char-Array kopiert.Stimmt daran etwas nicht?
Es wird der Funktion ein CString mit dem zu decodierenden Text übergeben.Grüße,
Michael
-
miha schrieb:
Stimmt daran etwas nicht?
Nicht wirklich, ist imho nur überflüssig - warum gibst du den String nicht direkt an MultiByteToWideChar()?
-
Danke dir!
-
BTW:
wenn du den letzten argument von MultiByteToWideChar auf 0 setzt, wird nichts convertiert, sondern du erhaelst die benoetigte groesse als int
int size = MultiByteToWideChar(CP_UTF8, 0, m, -1, w, 0);
char *m = new char[size];