(19. April 2005 — tk)

Umlaute/Sonderzeichen in der Shell?

Wie in Terminal.app oder Unix-Programmen korrekt mit Umlauten/Sonderzeichen umgehen? Viele Anwender stehen vor der Herausforderung, in einem Terminal oder Unix-Programmen (X11-Anwendungen, Carbon-Emacs, etc.) eine korrekte Darstellung bzw. Eingabe von Umlauten und anderen Sonderzeichen vornehmen zu müssen. Zum Glück ist es eigentlich ganz einfach :) - more —>

Da MacOS X intern weitestgehend komplett auf Unicode/UTF-8 setzt und auch Datei-/Ordnernamen in UTF-8 decomposed angelegt werden, empfiehlt es sich, dieser Vorgabe zu folgen. Das bedeutet, daß nachträglich an ein paar Parametern gedreht werden muß, damit es dann auch mit den Umlauten klappt.

1. Setzen von LANG:

LANG sollte auf »UTF8«, konkret »de_DE.UTF-8« gesetzt sein. Am besten Shell-übergreifend. Zu diesem Zweck hat Apple eine normalerweise nicht existente Datei »~/.MacOSX/environment.plist« vorgesehen. Definiert man darin Environment-Variablen, so werden diese von loginwindow an alle Kind-Prozesse vererbt und stehen somit allen Prozessen (auch solchen, die nicht via einer Shell gestartet werden) zur Verfügung. Um sich nicht mit den Interna der XML-kodierten Property List auseinandersetzen zu müssen, benutzt man einfach das defaults(1) Kommando: Zum Setzen der Variable genügt ein »defaults write ~/.MacOSX/environment LANG de_DE.UTF-8«, zum Lesen entsprechend »defaults read ~/.MacOSX/environment«.

Die Datei sieht anschließend wie folgt aus:

LANG
de_DE.UTF-8

2. Auswahl der richtigen Shell:

Mit Stand heute (10.3.9) scheint die mit MacOS X mitgelieferte tcsh insofern fehlerhaft zu sein, als sich damit kein »ß« eingeben läßt. Die Darstellung klappt dagegen. Die bash hat dieses Problem nicht — dafür klappt hier die Darstellung von Umlauten bei der Auflistung von Dateien mittels ls(1) erstmal nicht, da hier im Gegensatz zur tcsh kein internes Kommando verwendet wird und /bin/ls standardmäßig den Schalter »-q« gesetzt hat. Auszug aus der Manual page:

-q      Force printing of non-graphic characters in file names as the character '?'; this is the default when output is to a terminal.

Abhilfe schafft hier das Setzen eines Alias, das die Darstellung von Sonderzeichen zuläßt: alias ls=“ls -w” bspw. in /etc/bashrc (die ~/.bashrc wird normalerweise bei Benutzung von Terminal.app nicht ausgewertet — siehe dessen Grundeinstellungen und den Abschnitt »INVOCATION« in bash(1)).

3. Einstellungen in Terminal.app:

Hier ist natürlich dann ebenfalls auf UTF-8 umzustellen. Dazu einmal via Menü die »Fenstereinstellungen« öffnen und in der Sektion »Monitor« die Zeichensatz-Codierung auf »UTF-8« setzen und das dann am Besten gleich als Standard speichern.

Sollte es damit wider Erwarten nicht klappen und hat man evtl. bereits an den Konfigurationsparametern gedreht, so empfiehlt es sich, mit frischen Terminal.app-Einstellungen zu starten. Dazu einfach Terminal.app schließen, im Finder die Datei ~/Library/Preferences/com.apple.Terminal.plist auf den Schreibtisch ziehen, Terminal.app wieder starten und die Einstellung erneut vornehmen.

Ebenfalls daran denken, daß die Änderungen in »~/.MacOSX/environment.plist« erst nach einem erneuten Aus- und Wiedereinloggen gültig werden, weil sie erst dann von loginwindow vererbt werden können. Im Zweifelsfall im Terminal immer überprüfen, ob alles paßt: echo ${LANG} sollte korrekterweise de_DE.UTF-8 ausspucken.

Zusammenfassend nochmal die Einstellungen für einen schmerzfreien Umgang mit Umlauten in der Shell in MacOS X:

  1. Setzen von ${LANG} auf »de_DE.UTF-8«
  2. Einsatz von /bin/bash als Shell, dabei Setzen eines Alias ls=“ls -w”
    in /etc/bashrc
  3. Setzen der korrekten Einstellungen in Terminal.app — konkret Zeichensatz-Codierung auf »UTF-8« setzen.

Ach ja: Braucht man bspw. auf entfernten Servern, zu denen man sich per SSH verbinden will, andere Einstellungen (z.B. weil dort alle Dateinamen in ISO 8859-1 (vulgo Latin1) vorliegen, so ändert man sich einfach für die jeweilige Session in den »Fenstereinstellungen« von Terminal.app die Interpretation des Encoding. Vereinfachen kann man sich das Prozedere, indem man Fenstereinstellungen einfach in Terminal.app abspeichert (»Ablage / Sichern unter…«). Die dabei entstehenden Einstellungsdateien mit der Endung ».term« sind anschließend doppelklickbar. Sogar die initiale Kontaktaufnahme zu anderen Servern kann beim Abspeichern der Datei vorgegeben werden, indem man bspw. »exec slogin -l ${user} ${server}« direkt aufrufen läßt. Details und Anregungen diesbezüglich finden sich in diesem Usenet-Posting .