Prob nach dem switchen von SuSE Linux 9.0 auf 9.3
-
Hi,
Ich wollte ein C-Programm schreiben,dass in einem string nach einem Umlaut sucht und diesen dann durch den dazugehörigen Html-Code ersetzt.Das ging auch recht gut unter SuSE Linux 9.0...
jedoch haben wir in der Klasse vor ein paar tagen auf 9.3 gewechselt...und jetzt akzeptiert der neditor komischerweise keine Umlaute mehr...und das Programm funktioniert auch nicht mehr.Hier wäre das Programm:#include<stdio.h> #include<stdlib.h> #include<string.h> void main(void) { char txt1[81]; char txt2[600]; char *pt1; char *pt2; system("clear"); printf("\n\n Eingabe: \n\n"); scanf("%s",txt1); for(pt1=txt1,pt2=txt2;*pt1;pt1++,pt2++) { { switch(*pt1) { case 'ä' : strcat(txt2,"ä") ; pt2+=5;continue; case 'ö' : strcat(txt2,"ö") ; pt2+=5;continue; case 'ü' : strcat(txt2,"ü") ; pt2+=5;continue; case 'Ä' : strcat(txt2,"Ä") ; pt2+=5;continue; case 'Ö' : strcat(txt2,"Ö") ; pt2+=5;continue; case 'Ü' : strcat(txt2,"Ü") ; pt2+=5;continue; case 'ß' : strcat(txt2,"ß"); pt2+=6;continue; case '€' : strcat(txt2,"€") ;pt2+=5;continue; default : *pt2 = *pt1;continue; } } } printf("\n\n Umgewandelt = %s \n\n",txt2); }
Weiß vielleicht jemand woran das Problem liegt?Ich wäre für jede Hilfe dankbar!
cya sergio
<edit=kingruedi>
sfds
</edit>
-
Neuere Susen arbeiten IMHO mit UTF8, wenn man da nix andres sagt. WEnn Dies bei Euch der Fall ist, kann es sein, daß ein Umlaut neuerdings eben im Text nicht einzeichen darstellt, sondern mehrere Zeichen darstellt.
-
Heißt das,dass ich einfach die Umlaute blindlings da reinschreiben soll und dann schauen obs da geht oder wie?!?Oder kann ich da irgendwas machen,damit dass wieder funktioniert?
cya sergio
-
Grundsätzlich sollte man Zeichen ausserhalb des 7-Bit-ASCII-Zeichensatzes in C/"eine andere Programmiersprache"-Programmen vermeiden. Verwende mal die entsprechenden Escape-Sequenzen. Also: 'ä' => '\xe4', 'ö' => '\xf6', 'ü' => '\xfc', 'Ä' => '\xc4', 'Ö' => '\xd6', 'Ü' => '\xdc', 'ß' => '\xdf', '€' => '\xa4'.
-
Naja, also das Anwenden von Escapesequenzen wird das Problem auch nicht lösen: Ein Umlaut wird auf Deinem System wohl einfach mehr als ein Zeichen beanspruchen. Ob dem so ist, kannst Du ja ganz einfach rausbekommen:
$ echo "äöüÄÖÜß" >/tmp/umlatue
Ist Die resultierende Datei 8 Byte groß, dann werden die Umlaute nur mit einem Zeichen kodiert (7 Umlaute + 1 Newline); wenn die Datei aber mehr Byte enthält, bist Du in der o.g. UTF8 "Falle". Da kommst Du eigentlich nur raus, indem du das switch umbaust zu if-abfragen, etwa der Form:
if (strncmp("ö", pt1, strlen("ö"))==0) { ... ]
-
ich habe suse linux 9.1
dort werden die Umlaute alle in UTF8 dargestellt.
Das hat mich anfangs auch gewundert...
-
tntnet schrieb:
Grundsätzlich sollte man Zeichen ausserhalb des 7-Bit-ASCII-Zeichensatzes in C/"eine andere Programmiersprache"-Programmen vermeiden. Verwende mal die entsprechenden Escape-Sequenzen. Also: 'ä' => '\xe4', 'ö' => '\xf6', 'ü' => '\xfc', 'Ä' => '\xc4', 'Ö' => '\xd6', 'Ü' => '\xdc', 'ß' => '\xdf', '€' => '\xa4'.
So ein Blödsinn.
Natürlich kann man mit Umlauten und sogar mit japanischen oder klingonischen Zeichen arbeiten. Das Problem bei UTF-x ist, dass ein Zeichen nicht mehr eine feste Breite hat, sondern bei UTF-8 aus bis zu 4 byte (4 Zeichen im char-Sinne) bestehen kann. Das ist daher nötig, weil man 32Bit (Unicode 4.x) auf 8Bit mappen muss. Daher ist ein ä nicht mehr 1 byte breit, sondern 4, während ein a immer noch 1 byte groß ist.
Die Escape-Sequenzen kannst du auch vergessen, da sie nur für ISO 8859-15 gelten.
Hier mal ein wenig zum lesen:
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://www.cl.cam.ac.uk/~mgk25/ucs/ISO-10646-UTF-8.html
http://de.wikipedia.org/wiki/UTF-8
http://de.wikipedia.org/wiki/Zeichenkodierung
http://www.unicode.org/faq/
-
Ähm ok...jetz weiß ich das ein Umlaut nimmer 1 sondern 4 Byte einnimmt...weiß aber nicht,inwiefern mir das helfen sollte...denn ich kriege das immernoch nicht hin...Wäre nett wenn ihr mir etwas konkreteres sagen könntet.
Ok also ich habe den UTF-8 Zeichensatz ausgestellt...jetzt kann ich die Umlaute ganz normal schreiben,jedoch komme ich immernoch nicht in die case-fälle rein...wenn ich dort z.B. statt einem ä ein e reinschreibe geht das problemlos...ich bin mit meinem Latein langsam am Ende...HILFE!!!
cya sergio
-
switch/case kannst du nicht mehr benutzen, da du damit keine Byte-Sequenzen vergleichen kannst.
Du kannst den Code wie folgt schreiben:
#include <stdio.h> #include <string.h> enum { SIZE=100 }; int main() { char in[SIZE]; fgets(in, SIZE, stdin); char *ptr=in; while(*ptr) { if(!memcmp(ptr, "ä", sizeof("ä")-1)) { fputs("ä", stdout); ptr+=sizeof("ä")-1; } else if(!memcmp(ptr, "Ä", sizeof("Ä")-1)) { fputs("Ä", stdout); ptr+=sizeof("Ä")-1; } //... else { putchar(*ptr); ++ptr; } } return 0; }
Aber im Endeffekt hat UTF-8 ja den Vorteil, dass du diese ganzen HTML-Encodings gar nicht brauchst. Es reicht, wenn du das Encoding richtig in der Datei angibst (DOCTYPE-Tag und bei xhtml auch im xml-Tag).