nagelhammer Geschrieben 9. August 2002 Teilen Geschrieben 9. August 2002 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??? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. August 2002 Teilen Geschrieben 9. August 2002 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
nagelhammer Geschrieben 9. August 2002 Autor Teilen Geschrieben 9. August 2002 Das hat leider nicht geholfen! Die Rückgabeparamter sind immernoch leer!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. August 2002 Teilen Geschrieben 9. August 2002 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
nagelhammer Geschrieben 9. August 2002 Autor Teilen Geschrieben 9. August 2002 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 9. August 2002 Teilen Geschrieben 9. August 2002 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); Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
nagelhammer Geschrieben 9. August 2002 Autor Teilen Geschrieben 9. August 2002 Vielen Dank! Damit lösen sich die Probleme wie Zucker im Tee! Bas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 14. Juni 2004 Teilen Geschrieben 14. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 Hat nüscht gebracht. Auch die Konvertierung in ein OEM-String mit CString::AnsiToOem() hat nicht geholfen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 Danke sehr, so haut es hin. :marine Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 Dein erster Codeausschnitt funktioniert bei mir: Eingabe: "ABCdefÄÖÜäöüéÉ" Ausgabe: "ABCdefÄÖÜäöüéÉ" Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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". Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 29. Juni 2004 Teilen Geschrieben 29. Juni 2004 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 30. Juni 2004 Teilen Geschrieben 30. Juni 2004 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Juni 2004 Teilen Geschrieben 30. Juni 2004 Das entsprechende Sprachpaket muss installiert sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 1. Juli 2004 Teilen Geschrieben 1. Juli 2004 Alles klar und vielen Dank. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.