Veröffentlicht 9. August 200223 j Hello Folks! die Winapi bietet für die Konvertierung von Unicode in 'normale' (ähhh...was ist schon normal??) Zeichen, sowie andersrum, die Funktionen WideCharToMultiByte() und MultiByteToWideChar an. Jetzt möchte ich diesen Funktionen das Leben einhauchen, bekomme aber keine Ergebnisse geliefert. In VB sieht das dann etwa so aus: Dim bytDLTName(32) As Byte, bytSTDName(32) As Byte bytSTDName(0) = 252 bytSTDName(1) = 10 Call WideCharToMultiByte(CP_UTF8, 0, _ bytSTDName(0), 2, bytDLTName(0), 2, "", 0) Debug.Print "Wert:" Debug.Print bytDLTName(0) Debug.Print bytDLTName(1) Was kann man hier an meiner Stelle denn so tun???
9. August 200223 j Der vierte Parameter gibt die Anzahl der Zeichen an, nicht der Bytes. Da müsste also eine 1 rein. Der vorletzte Parameter muss bei CP_UTF8 Null sein. Außerdem werden als dritter und fünfter Parameter nicht die Zeichen selbst, sondern deren Adressen erwartet. Ich weiß aber nicht, wie das von VB aus funktioniert.
9. August 200223 j Manche UTF-8-Zeichen sind bis zu drei Bytes groß. Ist das ein ü, das Du konvertieren willst? Ich bekomme da als Ergebnis 224, 171, 188.
9. August 200223 j Die ausgabe ist irrelevant - sie soll allgemeingültig sein. Was hast Du denn da für einen Code reingehämmert. Ich bin sicher, daß ich was falsch gemacht habe Ich nehme den Code, auch wenn er in C++ nur gültig ist - alles weitere werde ich selber umwandeln! Vielen Dank...
9. August 200223 j Original geschrieben von nagelhammer Ich nehme den Code, auch wenn er in C++ nur gültig ist - alles weitere werde ich selber umwandeln! Bitte sehr: wchar_t widechar = MAKEWORD(252,10); char pResult[4]; memset( pResult, 0, 4 ); WideCharToMultiByte(CP_UTF8, 0, &widechar, 1, pResult, 3, NULL, 0);
14. Juni 200421 j Ich stehe vor dem selben Problem: Ich möchte eine Textzeile von UTF8 nach ANSI konvertieren, um Umlaute darzustellen. Ich habe mich an dieses Beispiel aus der MSDN gehalten: ... WideCharToMultiByte(CP_ACP, 0, ui->usri2_full_name, -1, dest, 256, NULL, NULL); Meine Zeile sieht so aus: WideCharToMultiByte(CP_UTF8, NULL, eString, -1, &AktuellTitel, sizeof(AktuellTitel), NULL, NULL); eString ist char*, AktuellTitel ist CString. In eString wird als Textstring ein char[300] übergeben. Es kommt die Fehlermeldung: e:\...: error C2664: 'WideCharToMultiByte': Konvertierung des Parameters 3 von 'char *' in 'LPCWSTR' nicht möglich Wie kriege ich das hin? Auch mit &eString funtkioniert es nicht.
29. Juni 200421 j Ich möchte eine Zeichenkette in UTF-8 umwandeln. Mein Code sieht so aus: LPCSTR mbstring={0}; LPWSTR wcstring={0}; CString text; int erg=0; mbstring="ABCdefÄÖÜäöüé\0"; erg=MultiByteToWideChar(CP_UTF8, NULL, mbstring, -1, wcstring, sizeof( wcstring)); text=wcstring; Im Ergebnis erg erhalte ich 7, aber wcstring ist leer und somit auch text. Weiterhin bleibt die Frage, wie es umgekehrt geht. Also von UTF-8 in eine Zeichenkette wie in mbstring.
29. Juni 200421 j Du übergibst der Funktion mit wcstring einen Pointer der auf keinen Speicherplatz verweist. Ich finde es komisch das Sie nicht mit einer Access Violation abbricht :eek: Leg dir mal ein Array von WCHARs oder so an und übergib dieses an MultiByteToWideChar um das Ergebnis aufzunehmen.
29. Juni 200421 j Sieht jetzt so aus: LPCSTR mbstring={0}; WCHAR wcstring[MAX_PATH]={0}; CString text; int erg=0; mbstring="ABCdefÄÖÜäöüéÉ\0"; erg=MultiByteToWideChar(CP_UTF8, NULL, mbstring, -1, wcstring, sizeof( wcstring)); text=wcstring; Ergebnis ist: erg=7; text=wcstring="ABCdef"; Das nützt mir nichts, denn ich brauche ja auch die Übersetzung von den anderen Zeichen.
29. Juni 200421 j Hmm...das könnte evtl. auch an etwas anderem liegen. Wenn du z.B. printf("äöü"); schreibst, bekommst du ja andere Zeichen ausgegeben. Mit printf("%c",132); bekommst du aber ein ä ausgegeben. Weise den einzelnen Stellen deines Strings mal die Ascii Codes der Sonderzeichen zu und versuche es dann. Da bin ich mir jetzt aber absolut nicht sicher ob es daran liegt.
29. Juni 200421 j Hat nüscht gebracht. Auch die Konvertierung in ein OEM-String mit CString::AnsiToOem() hat nicht geholfen.
29. Juni 200421 j So wird das nichts. Du musst zuerst aus dem ANSI-String einen Unicode-String machen. Den kannst du dann nach UFT8 konvertieren: char m[MAX_PATH]={0}; WCHAR w[MAX_PATH]={0}; CString text; int erg=0; strcpy(m, "ABCdefÄÖÜäöüéÉ"); erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR)); erg=WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0); text=m; [/CODE]
29. Juni 200421 j Nach UTF-8 geht es jetzt. Aber ich muss nun noch von UTF-8 nach ANSI konvertieren. erg=MultiByteToWideChar(CP_UTF8, 0, m, -1, w, sizeof(w) / sizeof(WCHAR)); erg=WideCharToMultiByte(CP_ACP, 0, w, -1, m, sizeof(m), 0, 0); Ich habe die Codepages getauscht, aber da werden die Umlaute wieder abgeschnitten. erg=MultiByteToWideChar(CP_ACP, 0, m, -1, w, sizeof(w) / sizeof(WCHAR)); erg=WideCharToMultiByte(CP_UTF8, 0, w, -1, m, sizeof(m), 0, 0); Hier konvertiert der zweite Aufruf die Umlaute wieder zu utf-8 oder hängt an UTF-8-Zeichen noch mehr UTF-8-Zeichen an, weil er die wieder konvertiert.
29. Juni 200421 j Dein erster Codeausschnitt funktioniert bei mir: Eingabe: "ABCdefÄÖÜäöüéÉ" Ausgabe: "ABCdefÄÖÜäöüéÉ"
29. Juni 200421 j Das ist bei mir auch so, aber wenn ich mit einem String reingehe, der einen Umlaut bzw. andere Sonderzeichen enthält, dann entfernt er diesen. Z. Bsp. wird aus "Häuser" -> "Huser".
29. Juni 200421 j Verstehe ich das richtig, dass du den String "Häuser" als Eingabe für die Konvertierung UTF8 nach ANSI benutzt? Wie kommst du darauf, dass "Häuser" ein gültiger UTF8-String ist? Unter Windows ist ä hex E4, also 1110 0100. Damit müsste das Sonderzeichen durch eine Drei-Zeichen-Repräsentation dargestellt werden. Bei den nachfolgenden zwei Zeichen 'u' und 's' ist aber das MSB nicht gesetzt -> ungültiger UTF8-String.
30. Juni 200421 j Das ist mir schon klar. Bevor ich den String konvertiere, lese ich vorher die CodePage aus, so dass der String mit der entsprechenden CodePage konvertiert wird. Mal noch ne Frage zur Darstellung in der Strukturansicht (CTreeControl): Wenn ein UTF-8-String eingelesen wird, der z. Bsp. japanische Schriftzeichen enthält, und mit CP_UTF8 in UNICODE konvertiert wird, sehe ich dann die Schriftzeichen oder irgend welche Steuerzeichen?
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.