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
--
To unsubscribe, e-mail: opensuse-programming+unsubscribe(a)opensuse.org
To contact the owner, e-mail: opensuse-programming+owner(a)opensuse.org