Hallo zusammen, vielleicht bin ich hier völlig falsch, vielleicht kann mir aber auch jemand helfen. 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. 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. Vielen Dank schonmal für's Mitdenken, Dieter -- ----------------------------------------------------------- Dr.-Ing. Dieter Jurzitza 76131 Karlsruhe -- 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
On 30.11.2016 20:48, Dr.-Ing. Dieter Jurzitza wrote:
Hallo zusammen, vielleicht bin ich hier völlig falsch, vielleicht kann mir aber auch jemand helfen.
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.
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.
Vielen Dank schonmal für's Mitdenken,
Das ist in der Tat das falsche Forum, aber ein mögliches Vorgehen ist hier beschrieben: http://stackoverflow.com/questions/11431950/ -- 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
Am Mittwoch, 30. November 2016, 20:48:15 schrieb Dr.-Ing. Dieter Jurzitza:
Hallo zusammen, vielleicht bin ich hier völlig falsch, vielleicht kann mir aber auch jemand helfen.
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.
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.
Vielen Dank schonmal für's Mitdenken,
ist gerade anders herum. fprintf arbeitet per default mit 8bit-ASCII. will man UTF8 muss man entsprechende %-Parmeter nutzen. man printf sagt dazu: %s If an l modifier is present: The const wchar_t * argument is expected to be a pointer to an array of wide characters. Wide characters from the array are converted to multibyte characters oder man benutzt die wprintf Familie von Routinen wprintf, fwprintf, swprintf, vwprintf, vfwprintf, vswprintf - formatted wide-character output conversion Jetzt muss man noch aufpassen, was der benutzte Texteditor mit Umlauten macht: Speichert er als UTF8 oder 8bit-ASCII? C ist an der Stelle eben noch in der 7 bzw 8bit ASCII-Welt geboren und verhaftet. Am einfachsten also: Editor dazu bringen 8bit ASCII (iso latin 8859-15 - westeuropäisch mit € Zeichen) zu speichern. Wenn schon utf8, dann konsequent überall.... Bye Jürgen -- Dr.rer.nat. Jürgen Vollmer, Am Rennbuckel 21, D-76185 Karlsruhe Tel: +49(721) 92 04 87 1 Fax: +49(721) 92 04 87 2 Juergen.Vollmer@informatik-vollmer.de www.informatik-vollmer.de ------------------------------------------------------------------------------- Diese EMail ist elektronisch mittels GPG / PGP signiert. Diese elektronische Unterschrift ist in einem EMail-Anhang enthalten. Leider kann die Signatur ohne die Installation entsprechender Programme weder geprüft noch angezeigt werden. Mehr dazu unter: http://www.gnupg.org oder auch http://www.pgpi.org -------------------------------------------------------------------------------
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
participants (4)
-
Christoph Feck
-
David Haller
-
Dr. Juergen Vollmer
-
Dr.-Ing. Dieter Jurzitza