[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Dateisysteme, Unicode, UTF-8 und Konvertierungsprobleme



#include <hallo.h>
* Stephan Seitz [Thu, Mar 13 2003, 05:55:44PM]:

> > Folgendes: Du bringst 2 Sachen zusammen die nicht zusammen gehören.
> > Einmal gibts da die Kodierung der Dateinamen im Dateisystem - bei Redhat
> > 8 wird offensichtlich die Standard NLS auf UTF-8 gesetzt und damit
> > werden dann alle Dateinamen in UTF-8 kodiert. Das andere ist die Anzeige
> > von UTF-8 kodierten Dingen. Das eine hat mit dem anderen nahezu nichts

IMO ja. Dann werden die Dateinamen direkt in UTF-8 geschrieben.

> Sagt mal, ist es bei Dateisystemen wie ext2/3 oder reiser nicht so,
> daß die Kodierung von der locale abhängig ist? Also ich habe hier ein
> Verzeichnis angelegt unter einer UTF-8-Umgebung (locale: de_DE.UTF-8)
> und die Namen sind falsch in de_DE@euro (also iso-8859-15) und
> natürlich umgekehrt. Ich dachte immer, diese NLS-Module bräuchte man
> nur für Samba, CD-ROM oder FAT, zumindest lädt der Kernel diese Module
> nur in diesem Zusammenhang.

Folgendes behaupte ich ohne Anspruch auf Richtigkeit:

Dateisysteme unter Linux und ihre Kodierungen sind eine komplizierte
Angelegenheit. Allgemein ist Internationalisierung nur mit langfristiger
und grundlegender Plannung elegant realisierbar. Microsoft erkannte dies
schon vor zehn Jahren und ihre neuere Dateisysteme verwenden allesamt
Unicode (VFAT, VFAT32, Joliet, NTFS, interne Kodierung ist AFAIK UCS-2
mit BOM, d.h. immer zwei-bytig mit einer Endianes-Markierung am
Stringanfang) [1]. Unter Linux dagegen hat man lange Zeit geschlafen:
grundsätzlich wurde alles auf der Annahme: Zeichen=Byte aufgebaut, kein
Dateisystem unterstützt Unicode, es gibt nicht mal eine interne
Zeichensatzdeklaration, die den Zeichensatz angibt. Alphabete mit
nicht-lateinischen Zeichen wurden nach bestimmten Tabellen
(NLS-Zeichensätzen) in dem erweiterten (8-bit) ASCII verteilt. Während
Probleme mit Zeichensätzen den Windows-Usern spaetestens seit Win2k
fremd sind, müssen sich Linux-Benutzer noch lange Zeit damit plagen. Man
ist in der Regel auf ein Zeichensatz beschränkt und muss die gesammte
Umgebung auf eine andere Locale umstellen (und ausserdem überall
händisch Fonts ändern, sofern das nicht durch Toolkits wie Gtk
vereinheitlich ist), wenn man mit anderen Welten Kontakt aufnehmen will.
Es gibt nähmlich keinen Mechanismus für Abwährtskompatiblität (wie in
Windows-XP), mit dem das System die Soll-Sprache einer Anwendung erkennt
und aus dem System-Internen Unicode automatisch mit der Soll-Sprache der
Anwendung kommuniziert.
Immerhin kann man bei deutschen Texten auch mit 7-bit ASCII auskommen,
das Umschreiben von wenigen Umlauten ist erträglich. Bei anderen, z.B.
kyrillischen Zeichensätzen, sieht es dagegen düster aus.

Als Lösung aus der Misere wurde UTF-8 auserkoren. Dies ist eine echte
Unicode-Variante: Mischung aus dem herkömmlichen ASCII und
Unicode-Zeichen, die in die Byte-Zeichen eingebettet werden. Der Vorteil
von UTF-8 ist die vollständige Kompatibilität zu ASCII (7-bit, keine
Probleme mit englischer Sprache) und somit die platzsparende
Datenlagerung im Vergleich zu UCS-2 oder UCS-4 bei wissenschaftlichen
Daten u.Ae. Aber nichts geht ohne Nachteile: 
 - Bei nicht-lateinischen Zeichensätzen benötigen die Zeichen mehr
   Platz, somit schrumpft die maximale Stringlänge beim gleichbleibenden
   reelen Speicherplatz (z.B. in Dateinamen). Womit wir früher oder
   später auf ein anderes Problem zusteuern, Beschränkungen, die man
   z.B. von Joliet kennt (64Zeichen)
 - Es ist nicht kompatibel zu vorhanden 8bit-Zeichensaetzen; somit sind
   alle Sprachen wieder "gleichberechtigt" und betroffene Benutzer
   gleichermassen von Umstellungsproblemen betroffen. Diese sind
   gewaltig, zu viele Programme sind einfach kurzsichtig entstanden und
   müssen geändert werden. Siehe Unicode-on-Linux-Howto für Details.
 - Daraus resultiert auch das nächste Problem: UTF-8 soll die nativen
   Zeichensätze irgendwann mal ersetzen. Unter ungünstigen Umständen,
   und diese sind immer zu erwarten, wenn man den Übergang nicht
   sorgfältig plannt, ensteht ein Gemisch aus UTF-8 und Zeichen in der
   alten NLS-Kodierung (z.B. latin1). Mir fällt nur eine vernünftige
   Lösung, um mit diesem Schlamassel aufzuräumen:
    - für Korrektur vorher: Perl-Skript, das das Dateisystem durchgeht
      und die Dateinamen NLS->UTF-8 ändern
    - für Korrektur nach der Panne: Perl-Skript, das das Dateisystem
      durchgeht und nur typische Spezialzeichen (hier: Umlaute) erkennt
      und ins UTF-8 umwandelt.

[1] Es ist also möglich, beliebige Zeichen auf von MS-stammenden
Dateisystemen zu speichern. Mit der Mount-Option
iocharset=8-bit-zeichensatz wandelt der Kernel die Zeichen zwischen
einer best. NLS-Kodierung für die Anwendungen und den gespeicherten
Unicode-Dateinamen im Dateisytem. 
Mit der Option utf-8 kodiert der Kernel das Dateisystem-interne
Unicode-Format ins UTF-8-Unicode, das für die Anwendungen sichtbar wird.
Dies erfordet natürlich Programe, die damit auch umgehen können,
siehe oben.
Mir ist leider keine Option bekannt, mit der man eine einseitig
beschränkte Konvertierung Unicode(UTF-8) <-> NLS (hier: latin1)
im Dateisystem durchführen könnte. Viele Benutzer möchten gar nicht den
vollen Unicode-Umfang ausnutzen und können sich bei den Dateinamen
durchaus auf ihren alten Zeichensatz beschränken - dafür aber keine
Probleme mit Namenslängen und ggf. Zeichensatz-Gemisch bekommen.

Gruss/Regards,
Eduard.
-- 
 Windows is great, I used it to download Linux.
   -- Seen on Slashdot (14.01.2000)

Attachment: pgp10EujYLTDP.pgp
Description: PGP signature


Reply to: