Hallo, Am Wed, 30 Nov 2016, Dr.-Ing. Dieter Jurzitza schrieb:
vielleicht bin ich hier völlig falsch, vielleicht kann mir aber auch jemand helfen.
Das gehört nach opensuse-programming[-de] (-de ist aber praktisch tot). Oder z.B. in die Newsgruppe de.comp.lang.c.
Ich möchte mittels "fprintf" Strings in eine Datei schreiben (unter linux, ist aber vermutlich davon unabhängig). Ein Minimalbeispiel:
#include <stdio.h>
int main (void){ FILE *outfile;
outfile=fopen("test.dat", "w");
fprintf(outfile, ">>%-36s<<\n", "Hier beginnt es:"); fprintf(outfile, ">>%-36s<<\n", "Viele Grüße!"); fprintf(outfile, ">>%-36s<<\n", "Viele Gruesse!"); fclose (outfile); return(0); }
Die Zeile mit "Viele Grüße" (2 Umlaute) ist 2 Zeichen kürzer als die anderen beiden Zeilen, wohl weil "C" für "ü" und "ß" als utf8 je 2 Zeichen vorsieht - in der Darstellung sind es aber nur je 1 Zeichen, so dass die zweite Zeile im Beispiel "zu kurz" wird und die Formatierung der folgenden Zeichen in dieser Zeile "kaputt", sprich: um zwei Zeichen nach links verschoben ist. Weiß hier jemand eine Lösung? Googeln hat mich nicht weitergebracht, ich habe auch mit "setlocale" herumexperimentiert, ist aber scheinbar ebenfalls egal.
Hm. Bei mir scheint das zu funktionieren.
Ach ja, "file" auf die Ausgabedatei liefert "test.dat: UTF-8 Unicode text". Die Problematik ist übrigens bei openSUSE 13.1 und bei leap 42.1 identisch, ich denke nicht, dass es eine releasespezifische Problematik ist.
Du brauchst z.B. die libicu (zypper in libicu-devel) und siehe z.B. http://userguide.icu-project.org/intro ==== t2.c [mit UTF8 als latin9 hier in der Mail!] ==== #include <unicode/ustdio.h> int main (void){ UFILE *outfile; outfile = u_fopen("test2.dat", "w", NULL, NULL); u_fprintf(outfile, ">>%-36s<<\n", "Hier beginnt es:"); u_fprintf(outfile, ">>%-36s<<\n", "Viele GrÃŒÃe!"); u_fprintf(outfile, ">>%-36s<<\n", "Viele Gruesse!"); u_fclose (outfile); return(0); } ==== Achtung: ich schreib und verwende hier noch latin9/iso-8859-15, das Grüße im Quelltext ist aber utf8 als latin9! Bitte ggfs. korrigieren! $ make t2 CFLAGS="-O2 -Wall -W" LDLIBS="$(pkg-config --libs icu-io)" cc -O2 -Wall -W t2.c -licuio -licui18n -licuuc -licudata -o t2 $ ./t2 $ cat test2.dat | recode utf8..latin9
Hier beginnt es: << Viele Grüße! << Viele Gruesse! << $ less test2.dat Hier beginnt es: << Viele GrÃŒÃ237e! << Viele Gruesse! <<
Wie gesagt: hier ist latin9-land, aber daß recode es als utf8 frisst und korrektes latin9 ausgibt und beim less sieht man, daß das utf8 korrekt angekommen ist; auch z.B. im XEmacs und jedit wird's korrekt dargestellt und die >>..<< korrekt formatiert (bei monospaced). Soweit ich's versteh solltest du alles per libicu einlesen/ausgeben, intern als unicode verarbeiten. Bei der Ausgabe kannst du dann locale/charset einstellen (name, flags, NULL, NULL) nimmt wohl die default-locale wenn ich's auf die Schnelle richtig gelesen habe. AFAIR gibt's Alternativen, aber die sind mir grad entfallen... HTH, -dnh -- panic("Aarggh: attempting to free lock with active wait queue - shoot Andy"); linux-2.0.38/fs/locks.c -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um den Listen Administrator zu erreichen, schicken Sie eine Mail an: opensuse-de+owner@opensuse.org