C++ Französische Buchstaben

Hi,

will einen kleinen Vokabeltrainer DeutschFranzösisch in C++ schreiben, habe jedoch das Problem die Sonderzeichen é,è,ê, … zu überprüfen.

habe z. B. ein char array mit Inhalt „frère“
Wenn ich dann mit cin.getline(…) einlesen und mir das eingelesene ausgebe, dann passt das auch.
Der Buchstabe è im Array array wird jedoch in ein anderes Symbol „umgewandelt“, sodass ich nicht vergleichen kann mit strstr(…)

Testcode:

char franz[50];
char deutsch[50];

strcpy(franz,„une filière“);

cin.getline(deutsch,50);

system(„cls“);

cout

habe z. B. ein char array mit Inhalt „frère“
Wenn ich dann mit cin.getline(…) einlesen und mir das
eingelesene ausgebe, dann passt das auch.
Der Buchstabe è im Array array wird jedoch in ein anderes
Symbol „umgewandelt“, sodass ich nicht vergleichen kann mit
strstr(…)

Du hast also anscheinend ein Problem mit Zeichensätzen bzw. Zeichencodierung – die Codierung der Zeichen im Quellcode passt nicht zur Codierung der Zeichen die du einliest oder ausgibst.

Computer können ja keine Buchstaben; sie können letztendlich nur Zahlen verarbeiten. Also weist man Buchstaben Zahlen zu… aber das geht auf verschiedene Arten und Weisen.

Die Buchstaben von A-Z und Ziffern von 0-9 haben in den meisten Nummerierungsmethoden dieselben Zahlen, aber bei Sonderzeichen hört’s dann schon auf… ein kleines „ä“ könnte zum Beispiel die Zahl 132 haben (etwa in der MS-DOS-Codepage 437), die Zahl 228 (etwa in ISO-8859-1 oder der Windows-Codepage 1252 für Westeuropa) oder durch die beiden Zahlen 195 und 164 wiedergegeben werden (UTF-8).

Wenn dein Quelltext in Windows-1252 geschrieben ist aber du UTF-8 einliest oder umgekehrt, passt das nicht zueinander, weil der Computer 195+164 einliest aber nach 228 sucht oder umgekehrt. Und so weiter.

Du musst also dafür sorgen, dass die Zeichen, die du einliest, und die, mit denen du vergleichst, dieselbe Zeichencodierung haben. Dafür musst du wissen, welche Codierung die eingelesenen Zeichen haben und welche die Zeichen im Quelltext, und wenn diese nicht zueinander passen, sie geeignet umwandeln.

Eventuell möchtest du auch nicht mit dem Datentyp char arbeiten sondern mit wchar_t (bzw. under C++ mit std::wstring statt mit std::string)… hierfür musst du aber auch dafür sorgen, dass die eingelesenen Bytes in die richtigen Zeichen umgewandelt werden.

Erfahrung mit solchen Umwandlungen habe ich mit C++ leider nicht, aber du hast nun ein paar Stichworte, mit denen du weitersuchen kannst.

Viel Erfolg!

Hi,

sorry, da kann ich Dir nicht weiterhelfen.

Gruß

Hermann

Sorry, habe mich aus dem Programmieren zurückgezogen. Muss meine Aktivitäten-Einträge noch diesbezüglich ändern. Hoffe, du findest jemand anderen, der dir die Frage beantworten kann.
Gruß M.

Lösung gefunden
ich habe eine Lösung gefunden, mit der ich am bereits programmierten Code am wenigsten ändern musste.

Ich habe mir über Escape Sequenzen die Zeichen rausgesucht, also z. B. \214 ist ein î oder \202 ist ein é.

Dann habe ich in den strcpy( ) Funktionen die Buchstaben durch diese Escape Sequenzen ersetzt.

Also aus strcpy(franz,„une filière“) wird dann zu strcpy(franz,"une fili\212re);

Hallo,
sorry dass das so lange gedauert hat, war grade mal weg …
Um deine Frage beantworten zu können, bräuchte man ein bisschen mehr Informationen. Welches Betriebssystem (–> Zeichensatz)? Welcher Compiler? Wie sieht die Ausgabe aus? Lieber etwas mehr angeben als etwas zu wenig …
Ich muss sagen, dass ich seit 20 Jahren nichts mehr mit „cin“ und „cout“ und Konsorten zu tun hatte, denn wir programmieren nur noch ‚graphisch‘. Es wird aber wohl irgendetwas mit unterschiedlichen Zeichensätzen zu tun haben.
Übrigens: wenn du schon C++ verwendest, warum nimmst du dann nicht die CString-Klasse? Ist viel einfach zu handhaben! Du kannst z.B . zwei CString-Objekte einfach mit == vergleichen (oder mit der Memberfunktion .Compare). Und Zuweisungen funktionieren einfach mit = (anstatt strcpy) …