In epistula a Daniel Graupner, die horaque Mon, Dec 20, 2004 at 08:15:49AM +0100:
> Der Hauptgrund is eigentlich Samba, damit die Dateinamen nicht verhunzelt
> sind. Ich hatte das nicht anders in Griff bekommen.
> Aber ich werds glauib ich lassen, hab grad mal eines meiner Latex-Files
> im Kile geöffnet, obwohl der auf iso... eingestellt ist, hat es mir alle
> Umlaute zerstört. Naja, man hat es eben mal versucht. ;-)
Die Umstellung auf UTF-8 ist unter Unix ziemlich schmerzhaft,
wie ich aus eigener Erfahrung berichten kann:
a) Es gibt viele Programme, die mit strlen() != Anzahl Zeichen
nicht zurechtkommen.
b) Sogar die Programme, die das eigentlich können sollten und
auch entsprechendes von sich behaupten, erfüllen die
Erwartungen nicht. Ich kenne diverse GTK-Programme,
die nur nette Umschreibungen, statt Umlauten ausgeben.
c) Die halbe Welt benutzt immer noch irgendwelche abstrusen
anderen Zeichensätze, der Wildwuchs wird auch noch eine
ganze Weile bestehen bleiben. Mindestens so lange, bis
alle die Notwendigkeit von mehr als 7-bit pro Zeichen
erkannt haben.
d) Windows selbst benutzt kein UTF-8, sondern UCS-16, auf FAT
Dateisystemen wird jeweils der lokale Zeichensatz verwendet.
Auf CD-ROMs mit Joliet-Erweiterung liegen UCS-16 Daten.
Unix Dateisysteme und -Programme pfeifen generell auf den
Zeichensatz der Dateinamen. Die Dateinamen von jemandem
auf einem UTF-8-System lesen, der Big5 verwendet ist manchmal
ganz lustig ;-).
Für die meisten (insbesondere leider Open Source-) Programmierer
ist US-ASCII eben doch noch der einzig existierende Zeichensatz.
Ich muß allerdings zugeben, daß Konstrukte wie:
== multibyte_test.c ==
#include <errno.h>
#include <locale.h>
#include <stdio.h>
#include <string.h>
#include <wchar.h>
#define MAX_LEN 32
int
main(void)
{
wchar_t wcs_string[MAX_LEN];
wchar_t wcs_format[MAX_LEN];
char utf8_string[] = "öäüßæ¤";
char utf8_format[] = "%ls\n";
size_t n;
setlocale(LC_ALL, "");
mbstowcs(wcs_format, utf8_format, sizeof(wcs_format) / sizeof(wchar_t));
mbstowcs(wcs_string, utf8_string, sizeof(wcs_string) / sizeof(wchar_t));
n = wprintf(wcs_format, wcs_string);
if (n == -1)
perror("wprintf()");
printf("%d characters printed.\n", n);
return(0);
}
== multibyte_test.c ==
auch nicht unbedingt mein Fall sind. Der Code oben enthält übrigens
einen potentiellen Buffer-Overflow, da mbstowcs() genau wie strcat()
bei zu kurzem Puffer das letze null-Zeichen nicht schreibt ;-).
Gruß,
Peter
-- Wissenschaftliche Wahrheit setzt sich nicht in der Weise durch, daß ihre Gegner überzeugt werden, sondern dadurch, dass die Gegner allmählich aus- sterben und eine nächste Generation von Anfang an mit den neuen Gedanken aufwächst. -- Max Plank To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org with "unsubscribe de-bsd-questions" in the body of the messageReceived on Mon 20 Dec 2004 - 21:56:20 CET