Logo

Unicode (UTF-8) unter Slackware

Dieser Artikel behandelt wie Unicode (UTF-8) unter Slackware eingerichtet wird - aber auch welche Stolpersteine dabei zu bewältigen sind.

 

Einleitung

Zuerst einmal, UTF-8 ist ein elektronisches Kodierungsverfahren. Bei der elektronischen Kodierung wird jedem Zeichen ein

Bitmuster zugeordnet. Eine der frühsten Formen der Kodierung war der Morsecode. Mit dem Aufkommen der Computer wurde 1967 ASCII (auch ANSI X3.4-1968) als Standard veröffentlicht. Bei ASCII wird jedem Zeichen ein Bitmuster aus 7 Bit zugeordnet. Bei sieben Bits und zwei unterschiedlichen Zuständen je Bit (0, 1) ergeben sich 128 verschiedene Bitmuster, die auch als die ganzen Zahlen 0–127 (hexadezimal 00–7F) interpretiert werden können.

ASCII kodiert lediglich 128 Zeichen, davon 33 nicht-druckbare sowie folgende 95 druckbare. Enthalten sind das lateinische Alphabet in Gross- und Kleinschreibung, die zehn arabischen Ziffern sowie einige Satz- und Steuerzeichen wie folgt:

Einfacher ASCII-Zeichensatz (7 bit)

 

Zweck von ASCII

ASCII diente ursprünglich dazu, Schriftzeichen der englischen Sprache darzustellen. Jetzt gibt es aber bekanntermassen nicht nur die englische, sondern viele andere Sprachen, die auch noch unterschiedliche Zeichen zur Darstellung verwenden. Sonderzeichen wie z.B. die deutschen Umlaute können mit ASCII nicht dargestellt werden, hierfür würden 8 bis 16 Bit benötigt.

Ein erster Versuch (ISO 646) das Problem anzugehen führte zu Kompatibilitätsproblemen. Verschiedene Hersteller entwickelten daraufhin ihre eigenen Codes. Der unter IBM PC’s unter DOS verbreitete hiess Codepage 437. Beim späteren Standard ISO 8859 und seinen Varianten wurden 8 Bits zur Codierung verwendet. Der in westeuropäischen Sprachen zur Anwendung kommende Code heisst 8859-1 (latin 1) oder 8850-15 (latin 9), der auch das Euro-Symbol darstellen kann. All diese ISO 8859-Zeichensätze haben den grossen Nachteil, dass sie pro Zeichen nur 1 Byte verwenden und so pro Zeichensatz nur 256 Zeichen darstellen können.

 

Unicode

Um die Zeichen der unterschiedlichen Sprachen darstellen zu können, wurde der Unicode entwickelt. Er verwendet bis zu 32 Bit pro Zeichen. Damit können über vier Milliarden verschiedene Zeichen unterschieden werden, genug, um bislang alle von der Menschheit verwendeten Schriftzeichen darstellen zu können (sofern sie denn in den Unicode-Standard aufgenommen wurden).

UTF-8 ist eine 8-Bit-Kodierung von Unicode, die abwärtskompatibel zu ASCII ist. Ein Zeichen kann dabei ein bis vier 8-Bit-Wörter einnehmen. Mit der Hilfe von UTF-7 kann nach wie vor auch in sieben Bit kodiert werden. UTF-8 hat sich zum einheitlichen Standard unter den meisten Betriebssystemen, darunter auch Linux, entwickelt.

 

Warum UTF-8 verwenden?

Die Gründe hierfür sind im Prinzip einfach:

  • Probleme zwischen verschiedenen Betriebssystemen erledigen sich
  • Nahezu alle Zeichen aller Schriftsysteme können nebeneinander dargestellt werden und funktionieren auf allen modernen Rechnern
  • Es gibt im Prinzip keine Konvertierungs- und Darstellungsprobleme mehr
  • Text lässt sich mit besonderen Zeichen (Sonderzeichen) versehen
  • Texte lassen sich in verschiedenen Sprachen und Zeichensystemen verfassen

 

Problemstellen bei der UTF-8 Umstellung

Probleme können beim Nebeneinanderbestehen alter und neuer Systeme entstehen. Nachstehend die Wichtigsten, es sind aber auch noch andere Varianten denkbar.

  • Wenn im umgestellten System weiterhin auf „alte” Daten zugegriffen wird. Mit „alt” sind Daten gemeint, die mit Nicht-Unicode-Systemen erstellt worden sind
  • Wenn umgestellte und nicht umgestellte Systeme auf die gleichen Daten zugreifen und diese bearbeiten

 

Betroffen von der Kodierung sind die folgenden Stellen, wobei die ersten beiden als die Schwerwiegendsten zu betrachten sind:

  • Dateinamen
  • Textdateien wie E-Mails, Sourcecode, Scripts, HTML-Files usw. **
  • Kopier- und Einfügaktionen via Zwischenablage (Cut & Paste)
  • Standardinput, -output, -error, Pipes
  • Umgebungsvariablen
  • Remote-Zugriff auf andere Rechner via Telnet, SHS, Modem, Verbindungen über den seriellen Port

 

** Mit dem Kommando „file dateiname” kann die Kodierung einer bestehenden Datei ermittelt werden.

 

Ob Textdateien richtig verarbeitet werden, hängt davon ab, ob:

  • Die verwendeten Programme und Betriebssysteme die alte (ISO 8859-x) und neue Kodierungsform (UTF-8) verstehen. Die grafischen Oberflächen wie KDE und GNOME sowie deren Programme können inzwischen gut mit Unicode umgehen
  • Programme die Kodierung via Umgebungsvariable verstehen (z.B. Kommandozeilenprogramme, Terminalemulatoren) oder explizite Angaben in Dokumente auswerten können (z.B. Webbrowser)
  • Problematisch wird es, wenn Programme das Kodierungsverfahren fix bestimmen oder mit Unicode gar nicht umgehen können – problematisch sind:
    • Schriften ohne Unicode-Unterstützung
    • Programme ohne character-rewrite
    • gtk1
    • bash < v.3 & readline < v.5

 

Viele prominente Programme waren vor nicht allzu langer Zeit noch nicht zu 100 Prozent Unicode kompatibel, darunter:

  • mc
  • xterm
  • mount_smbfs
  • tar

 

Konvertierung von Dokumenten und Dateinamen

Im Schluss bedeutet die Umstellung auf UTF-8, dass früher oder später Dateinamen und Textdateien auf Unicode umgestellt werden müssen. Dafür gibt es allerdings Programme, die den mühsamen Vorgang unterstützen.

 

ISO 8859-1 – UTF-8:
iconv -f ISO8859-1 -t UTF-8 „iso8859-1_datei" >"utf8_datei"

UTF-8 – ISO 8859-1:
iconv -f UTF-8 -t ISO8859-1 "utf8_datei" > „iso8859-1_datei"

 

Eine Konvertierung kann z.B. auch manuell mittels eines Unicode-fähigen Programms wie KWrite erfolgen.

Mit „convmv“ können nicht konforme Datei- und Verzeichnisnamen in UTF-8 umgewandelt werden. In diesem Fall werden das Verzeichnis und die darin befindlichen Dateien rekursiv (-r) konvertiert.

 

convmv --notest -r -f ISO8859-1 -t UTF-8 <Verzeichnisname

 

Zusätzlich

UTF-8 „locales” müssen existieren, diese werden aber inzwischen beim kompilieren der „glibc” automatisch erzeugt. Eine Locale ist ein Einstellungssatz, der die Gebietsschemaparameter für Computerprogramme enthält.

 

Locales

Der Befehl „locale” zeigt die aktuell eingestellten locales an. Der Befehl „locale –a” zeigt alle zur Verfügung stehenden locales an.

Rechner mit Unicode UTF-8:

LANG=de_CH.utf8
LC_CTYPE=“de_CH.utf8”
LC_NUMERIC=“de_CH.utf8”
LC_TIME=“de_CH.utf8”
LC_COLLATE=“de_CH.utf8”
LC_MONETARY=“de_CH.utf8”
LC_MESSAGES=“de_CH.utf8”
LC_PAPER=“de_CH.utf8”
LC_NAME=“de_CH.utf8”
LC_ADDRESS=“de_CH.utf8”
LC_TELEPHONE=“de_CH.utf8”
LC_MEASUREMENT=“de_CH.utf8”
LC_IDENTIFICATION=“de_CH.utf8”
LC_ALL=

Rechner ohne Unicode:

LANG=de_CH
LC_CTYPE=““de_CH”
LC_NUMERIC=“de_CH”
LC_TIME=“de_CH”
LC_COLLATE=“de_CH”
LC_MONETARY=“de_CH”
LC_MESSAGES=“de_CH”
LC_PAPER=“de_CH”
LC_NAME=“de_CH”
LC_ADDRESS=“de_CH”
LC_TELEPHONE=“de_CH”
LC_MEASUREMENT=“de_CH”
LC_IDENTIFICATION=“de_CH”
LC_ALL=

 

Unicode in Slackware aktivieren

Schritt 1:

Zuerst einmal die Locale (Gebietsschemaparameter) setzen. Dazu die Datei „/etc/profile.d/lang.sh“ editieren und anpassen, z.B.

 

export LANG=de_CH
in
export LANG=de_CH.utf8 ändern

 

Eventuell ist es notwendig, einzelne / alle der obigen LC-Variablen ebenfalls mit UTF-8 zu belegen. Mit LC_ALL kann dies einfach für alle Variablen erfolgen.

Falls in Deutschland (de_DE) oder Österreich de_AT entsprechend anpassen


Schritt 2:

Jetzt einen Unicode-fähigen Konsolenfont auswählen. Dazu muss allenfalls die Datei „/etc/rc.d/rc.font“ editiert und angepasst werden. Ich verwende den Font „lat9w-14.psfu“. Die verfügbaren Konsolenfonts sind im Verzeichnis „/usr/share/kbd/consolefonts“ zu finden. Der Konsolenfont kann auch via

 

/usr/bin/setconsolefont


eingestellt werden.

 

Als Workaround, aber nicht zu empfehlen: CONSOLETRANSLATION=“8859-1_to_uni“ in der Datei rc.font aktivieren.


Schritt 3:

In „/etc/rc.d/rc.local“ folgendes eintragen:

 

unicode_start


Schritt 4:

Anpassung für “man” unter Unicode – dafür einen alias in „/etc/profile“ oder ~/.profile anlegen:

 

alias man='LC_ALL=C man'


Schritt 5:

In der Datei „~./bashrc“ folgendes eintragen:

 

if [ $TERM = "linux" ]; then
setfont ter-v16n
fi

 

Schritt 6:

Der X11-Server ist UNICODE-kompatibel – nur die Tastatur muss korrekt konfiguriert werden:

PC-Tastaturen mit Windows- und Kontextmenütaste (105-Tasten) benötigen die Zeile:
Option "XkbModel" "pc105"

PC-Tastaturen ohne Windows-Tasten, zum Beispiel IBM-Laptoptastaturen, benötigen die Zeile:
Option "XkbModel" "pc102"

Die Zeile mit "XkbLayout" definiert das Tastaturlayout. Also:
Option "XkbLayout" "de_DE" => Deutschland
Option "XkbLayout" "de_CH" => Schweiz
Option "XkbLayout" "de_AT" => Österreich

 

Schritt 7:

Überprüfen und falls notwendig anpassen der Kodierungseinstellungen der verschiedenen Programme unter KDE / GNOME.

 

Schritt 8:

Im Kernel müssen einige Einstellungen für UTF-8 evtl. angepasst werden. Im Kernel (2.6.x) unter >> Filesystems

>> CONFIG_NLS_UTF8
>> CONFIG_NLS_DEFAULT

nls settings

Optional:

CONFIG_SMB_NLS_DEFAULT
CONFIG_SMB_NLS_REMOTE

nls settings

CONFIG_FAT_DEFAULT_CODEPAGE
CONFIG_FAT_DEFAULT_IOCHARSET (nicht auf utf8 setzen)

nls settings

 

Zusatz: Kodierung in Terminalemulatoren

Werden Programme in einem Terminalemulator ausgeführt, tritt der Terminalemulator quasi als Vermittler auf. Der Terminalemulator muss ermitteln, in welcher Kodierung Eingaben dem Programm übergeben werden müssen und in welcher Kodierung die Ausgaben erfolgen resp. zu erfolgen haben. Es können Probleme auftreten, wenn:

  • wenn bei einer Remote-Verbindung wie z.B. SSH ein entfernter Rechner in einem lokalem Terminalfenster aufgerufen wird und sie unterschiedliche Kodierungen verwenden
  • Wenn sich die Kodierung der Daten von der eingestellten Kodierung unterscheiden

 

Bei der Problembehandlung muss beachtet werden, dass Kommandozeilenprogramme die Ein- und Ausgabekodierung oftmals über die LANG-Variable steuern. Es ergibt sich also ein Zusammenspiel bei der Verarbeitung der Daten im Terminalemulator und im Kommandozeilenprogramm.

 

UTF-8 fähige Texteditoren

Eine Auswahl an Texteditoren, die UTF-8 verstehen sind:

  • kwrite
  • kate
  • vi(m)
  • emacs
  • xemacs

 

Problemlösungsansätze

Daten die verarbeitet werden sollen liegen nicht im Unicode-Format vor, werden aber vom Terminalemulator als Unicode identifiziert:

 

LANG=de_CH konsole &
export LANG=de_CH

 

Dateinamen in einem Verzeichnis ansehen, die Zeichen in ISO 8859-Kodierung enthalten:

 

LANG=de_CH luit ls

 

Inhalte von Textdateien ansehen, die ISO8859-Zeichen enthalten:

 

LANG=de_CH luit cat „dateiname“

 

Remotezugriff auf einen Rechner mit ISO 8859 Kodierung:

 

In einem Terminalfenster das auf Unicode eingestellt folgendes eingeben:
LANG=de_CH luit ssh „rechnername“ – Alternative:
LANG=de_CH konsole &
ssh „rechnername“

 

Begriffserklärungen

ASCII

Zu den ASCII-Zeichen gehören die lateinischen Buchstaben, Ziffern und eine Vielzahl von Sonderzeichen (keine Umlaute). Bei ASCII wird jedem Zeichen ein Bitmuster aus 7 Bit zugeordnet. Bei sieben Bits und zwei unterschiedlichen Zuständen je Bit (0, 1) ergeben sich 128 verschiedene Bitmuster, die auch als die ganzen Zahlen 0–127 (hexadezimal 00–7F) interpretiert werden können.

 

ISO8859

Die vor Unicode gebräuchliche Codierungsart für Textzeichen. Es handelt sich um einen ein Byte Code, weshalb auch nur im Zahlenbereich von 0 bis 255 codiert werden kann. In der Praxis stehen allerdings weniger als die 256 Möglichkeiten zur Verfügung, da einige der Kombinationen für Steuerungszeichen verloren gehen. Da dies nicht ausreicht, wurden Zahlenwerten grösser als 127 mehrere Bedeutungen zugewiesen und jeweils regional bedingt in einem Standard ISO 8859-x festgelegt. Die richtige Interpretation erfolgte dann durch die Sprachauswahl in der LANG-Variable.

 

UTF-8
Jedem in der Welt vorkommenden Textzeichen und Textsymbol ist im Unicode-Standard ISO-10464 ein eindeutiger Code zugeordnet. Vor der Nutzung muss dieser Code aber noch „verpackt” werden – bei UTF-8 handelt es sich um eine solche standardisierte Verpackung von Unicode-Zeichen.