[c unter Linux] Problem mit speichern von Sonderzeichen

Überschrift sagt ja schon alles. Habe hier ein kleines Programm und frage mich wieso das Sonderzeichen ä (oder auch andere ü,ö,ß,...) nicht korrekt gespeichert wird. Bin schon über ne Stunde auf der Suche nach der wahrscheinlich einfachen Lösung. Bitte um Hilfe
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main() {
FILE *f2;
f2 = fopen("test.txt", "w");
int i = 'ä';
fputc(i,f2);
fclose(f2);
}
Gruß
 
Das liegt an der Konsole, die Zeigt das nur nicht richtig an.
Ist auch bei printf("%s", "hallöle"); das ist das gleiche.
 
das ist ja das komische.
printf("%s", "hallöle");
gibt hallöle aus

folgendes geht auch
char* temp = "hallöle";
printf("%s", temp);

folgendes geht aber nicht
char* temp = "hallöle";
printf("%c", temp[4]);
da gibt er anstatt dem ö ein ausgefülltes quadrat aus
 
nacktes C ist nur für 7bit ASCII wirklich gut geeignet.
aber zurück zur Fehlersuche. benutzt du eventuell ein Terminal, das auf UTF als Zeichensatz gestellt ist?
 
Wenn ich locale eingebe, wird folgendes ausgegeben

LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

Muss ich da vielleicht was ändern?
Gruß
 
Hab mir mal den Bericht von Joel durchgelesen. Bin hier wie blöd am rumprobieren und suchen nach informationen um einfach nur ein ä auf meinem Bildschirm auszugeben. Es funktioniert mit den beiden folgenden codes nicht

// gibt ein dunkles quadrat aus
main() {
int i = 228;
fprintf("%c", i);
}

oder


// gibt mehrere ? aus
main() {
wchar_t i;
i = 0xc3a4;
fwprintf(stdout, "%c", i);
}


Kann mir bitte jemand ein beispiel schicken, wie er ein ä auf seinem bildschirm in utf8 ausgibt.
Danke
 
Dein "Bildschirm", Terminal, Konsole, wie auch immer, benutzt bzw erwartet ebenfalls ein bestimmtes encoding. Das kann ASCII sein, oder auch ISO-8859-1, Codepage 8hundertirgendwas, oder eben UTF. Meist UTF-8, ist aber egal, entscheident ist, wenn Du die Strings nicht selber ausgibst, zB mit X11 oder GDI oder Quartz, sondern über eine Konsole, dann muß diese raten, welches encoding es sein soll. Und jenachdem, ob sie das richtige geraten hat, sehen die Buchstaben aus, wie sie sollen.
anders ausgedrückt, Joel redet nur von Speicherung, du aber hast Probleme mit der Ausgabe.
ich fürchte, wir sind der Lösung nicht näher gekommen, und warte auf deinen nächsten post :-)
 
Hab doch gestern angegeben was meine Konsole bei der Eingabe von locale ausgibt. Bedeutet die Zeile Lang=de_DE.UTF-8 nicht, dass meine Konsole UTF-8 erwartet?

UPDATE: Nach weiterem rumprobieren hat es geklappt. Folgender Code gibt zumindest mal die Sonderzeichen auf der Konsole aus. Morgen leih ich mir ein Buch aus über UTF-8 und wie man es mit C richtig benutzt.

#include <locale.h>

void main() {
setlocale(LC_CTYPE,"");
int i;
for (i=0;i<256;i++) {
printf("%lc\n", i);
}
}
 
Jede anständige Konsole erwartet bei einem UTF8-Locale UTF-8. 'ä' ist in latin1 0xE4, in UTF-8 0xC8 0xA4. UTF-8-Zeichen haben eine variable Länge. ASCII-Zeichen 1 byte, (mindestens) Latin1-Zeichen 2 byte, fernöstliche Schriften in der Regel 3 byte IIRC.
 
das "locale" sagt nichts aus, außer über das "locale" eben. Wenn ein Programm diese shellvariable ausliest, schön, wenn nicht, dann halt nicht.
Trotzdem muß Deine Konsole den Bytestrom, den Du ihr hinwirfst, irgendwie auswerten. Die Konsole kann nicht raten, ob es ASCII, EBCDIC, UTF8, UTF16, sonst was ist. Du mußt es irgendwo eingestellt haben. Guck ins Mausmenü, bitte.
Falls das nirgendwo steht, mußt Du es halt durch Ausprobieren herausfinden.
 
Zurück
Oben