Re: Umstellung auf UTF8

From: Peter Wullinger <some-mail-drop(at)gmx.net>
Date: Mon, 20 Dec 2004 21:55:47 +0100

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 message
Received on Mon 20 Dec 2004 - 21:56:20 CET

search this site