Re: Praxistips: Umlaute usw. in Shell-Skripten umkodieren

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Fri, 21 Mar 2014 15:07:34 +0100 (CET)

Polytropon <freebsd(at)edvax.de> wrote:
> Dann muß ich mir an dieser mal die Blöße geben und fragen:
> Was ist _heute_ die sinnvollste Weise, lokal festzulegen,
> welche Lokalisierung für ein bestimmtes Login bzw. für
> eine Sitzung unter X (unabhängig von WM oder DE) fest-
> zulegen ist?
>
> Unelegant: Setzen von $LC_* via ~/.cshrc. Besser, über
> ~/.login.conf?

Hat alles Vor- und Nachteile. Von ~/.cshrc würde ich eher
abraten, da es bei _jedem_ Shell-Aufruf ausgeführt wird,
was es schwieriger macht, den Wert (vorübergehend) in einer
Sub-Shell zu ändern, denn bei jedem Aufruf wird er wieder
überschrieben. Sowas wie "env LC_CTYPE=foo csh" ginge dann
nicht mehr ohne weiteres.

Also besser den Default-Wert per ~/.login.conf oder per
~/.login setzen; letztere wird von der csh nur bei Login-
Shells gelesen, aber nicht bei jedem Shell-Aufruf.
Das Äquivalent für die sh(1) ist ~/.profile, für die
zsh ist es ~/.zprofile (sofern sie sich nicht in einem
Emulationsmodus für sh, ksh oder csh befindet).

~/.login.conf hat den Vorteil, dass es unabhängig von der
Shell ist. Andererseits wird es bei ssh-Logins evtl. gar
nicht ausgeführt, je nachdem, ob in der sshd-Config
UseLogin enabled ist (per Default ist es das nicht, glaube
ich), aber das habe ich nicht getestet. Aber die Frage
ist auch, ob bei einer ssh-Verbindung das locale überhaupt
von der Gegenseite gesetzt werden sollte, oder ob es von
der lokalen Seite durchgereicht werden sollte (wie es bei
TERM der Fall ist). Sinnvoll wäre letzteres schon, aber
man muss das evtl. im Einzelfall entscheiden.

Wenn sich UTF-8 weit genug verbreitet hat und "überall"
funktioniert, sind diese ganzen Überlegungen sowieso
hinfällig. Dann wird es einmal irgendwo gesetzt (egal
wo), und gut ist's.

> Als Kombinationsn stehen ja de_DE sowie
> en_US als "Präfix" und ISO8859-1, ISO8859-15 oder UTF-8
> als "Suffix" bereit, zumindest, was für uns in Deutschland
> so relevant sein dürfte. Was nimmt man denn da heute
> am günstigsten?

Das ist eine gute Frage. Und die Antwort lautet: Es kommt
drauf an. :-)

Zunächst zum Suffix, d.h. der Zeichensatz-Kodierung.

Rein prinzipiell ist UTF-8 die bessere Wahl. Man muss halt
ausprobieren, ob alle Tools und Programme, die man verwendet,
damit zurechtkommen. Unter X11 geht so gut wie alles, aber
bei den Kommandozeilen-Tools gibt's wohl noch den einen oder
anderen Haken. (Bernd erwähnte nvi, glaube ich, aber ich
meinte eigentlich, dass da inzwischen auch UTF-8 könne.
Ich kann's nicht mit Sicherheit sagen, da ich es nicht
benutze.) Für UTF-8 setzt man LC_CTYPE auf "de_DE.UTF-8".

Wenn es irgendeinen Show-stopper gibt, dann ist man wohl mit
ISO8859-15 (a.k.a. Latin9) ist man auf der sicheren Seite.
In dem Fall setzt man z.B. LC_CTYPE auf "de_DE.ISO8859-15".

Und zum Präfix, d.h. die Sprachdefinition: Statt "de_DE..."
kann man auch "en_US..." nehmen, wenn es einem besser
gefällt, aber einen Unterschied macht es bei LC_CTYPE
nicht. Es spielt nur bei den anderen LC_*-Kategorien
teilweise eine Rolle, z.B. beim Datumsformat, Zahlenformat
(Dezimalpunkt vs. Dezimalkomma) und bei der Sortierung.

> (Ich erwähne $LC_* deshalb, weil
> es die Möglichkeit bietet, englische Programmausgaben,
> aber deutsche Sortier-, Währungs- oder Zeitkonventionen
> "gleichzeitig" zu benutzen.)

Vollkommen richtig. Ich persönlich setze ausschließlich
LC_CTYPE, was ja für die Zeichenkodierung genügt. Alles
andere (Dezimalpunkt, Sortierreihenfolge, Datumsformat,
Meldungen von Programmen) soll bei mir dem POSIX-locale
entsprechen, daher setze ich weder LANG noch LC_ALL.
Erstens, weil ich es so gewohnt bin, und zweitens, damit
es möglichst wenig Probleme mit fremden Skripten gibt, die
versuchen, Ausgaben von "ls -l", "date" usw. zu parsen und
irritiert sind, wenn da plötzlich "Okt" statt "Oct" steht,
oder wenn die csh plötzlich sagt "Befehl nicht gefunden"
statt "Command not found".

> Und: Wie kann man "mal schnell" eine Shell (oder ein xterm)
> von einem in den anderen Modus umschalten oder dediziert
> starten ("ISO-X-Terminal" vs. "UTF-X-Terminal")?

Ok, folgendes habe ich mit der zsh gemacht. Mit der bash
oder csh/tcsh geht's aber genauso.

        $ echo $LC_CTYPE
        de_DE.ISO8859-15
        $ echo -n föö | od -An -tx1
                   66 f6 f6

Soweit, so gut: Meine Default-Kodierung ist ISO8859-15.
Jetzt starte ich ein xterm mit UTF-8:

        $ env LC_CTYPE=de_DE.UTF-8 xterm &

Folgendes gebe ich in das neue xterm ein:

        $ echo $LC_CTYPE
        de_DE.UTF-8
        $ echo -n föö | od -An -tx1
                   66 c3 b6 c3 b6

Vergleiche den Hex-dump von od(1) in beiden Fällen: Da siehst
Du, welche Kodierung tatsächlich benutzt wird: 0xf8 ist der
Code für ein "ö" in ISO8859-15, 0xc2 0xb6 ist die entsprechende
Sequenz in UTF-8.

Auf diese Weise kann man also jederzeit beliebig viele xterms
mit verschiedenen Kodierungen öffnen, wenn sich der Bedarf
ergibt oder wenn man einfach etwas ausprobieren möchte.
Vermutlich geht es mit anderen Terminals (z.B. rxvt) ebenso,
ich hab's aber jetzt nur mit xterm probiert, weil ich das
selbst benutze.

Wichtig ist, dass LC_CTYPE bereits beim Starten des xterms
gesetzt ist, damit das xterm von Anfang an darüber Bescheid
weiß und sich mit der Shell darüber einig ist. Falls das
rc-Skript Deiner Shell den Inhalt von LC_CTYPE wieder
überschreibt (siehe oben), musst Du ihn in der Shell wieder
korrigieren, sonst gibt's Probleme.

Man kann UTF-8 auch bei einem laufenden xterm irgendwo in
seinen Menüs (Ctrl-Taste + linke/mittlere/rechte Maustaste)
ein- und ausschalten, aber ob und wie gut das funktioniert,
kann ich nicht sagen. Ich starte das xterm immer gleich mit
dem gewünschten LC_CTYPE, dann klappt's auf jeden Fall.

Mit den xterms kann man jetzt diverse Sachen ausprobieren.
Gib z.B. mal im UTF-8-xterm folgendes ein:

        $ touch föö
        $ ls -l f*
        -rw------- 1 olli wheel 0 Mar 21 14:54 föö

Man sieht hier, dass das Globbing der Shell das "*" auch mit
UTF-8 korrekt expandiert hat. Aber wie ist nun der Dateiname
kodiert? Natürlich auch mit UTF-8, wovon man sich in dem
anderen xterm, das mit ISO8859-15 läuft, überzeugen kann:

        $ ls -l f*
        -rw------- 1 olli wheel 0 Mar 21 14:54 föö

Und umgekehrt? Also, im ISO8859-15-xterm:

        $ touch göö
        $ ls -l g*
        -rw------- 1 olli wheel 0 Mar 21 14:55 göö

Und dann im UTF-8-xterm:

        $ ls -l g*
        -rw------- 1 olli wheel 0 Mar 21 14:55 g??
        $ ls -lB g*
        -rw------- 1 olli wheel 0 Mar 21 14:58 g\366\366

Der Code 0xf8 ist in UTF-8 keine gültige Zeichensequenz,
daher werden die Fragezeichen ausgegeben. Mit der Option
-B wird ls(1) veranlasst, stattdessen die "nackten" Codes
auszugeben (oktal).

> Definitiv. Ich muß ja gestehen, daß das für mich alles
> bunter Wunderhund war, bis mir ein Text mit deutschen
> Umlauten und chinesischen Schriftzeichen unterkam, der
> bearbeitet werden wollte (LaTeX). Das war furchtbar. :-)

Mit UTF-8 ist das (theoretisch) kein Problem.

Man kann LaTeX ja sagen, dass die Eingabe in UTF-8 kodiert
ist (Umlaute gibt ja auch seit mind. 15 Jahren niemand mehr
als "a, "o, "u und \3 ein). Bei den chinesischen Zeichen
sieht man dann im Editor evtl. nur Fragezeichen, wenn man
keinen passenden Terminal-Font hat, was aber egal ist, wenn
man die chinesische Schriftzeichen eh nicht beherrscht,
sondern die Zeichen nur "handhaben" muss, d.h. herumschieben,
kopieren o.ä. Wenn man sie dagegen tatsächlich lesen können
muss, dann muss man natürlich einen passenden Terminal-Font
installieren. Rendern nach dvi bzw. PDF oder PostScript ist
auch kein Problem, man benötigt dann (und zum Ausdrucken)
natürlich auch die passenden Schriftarten.

Gruß
   Olli

-- 
Oliver Fromme,  secnetix GmbH & Co. KG,  Marktplatz 29, 85567 Grafing
Handelsregister:  Amtsgericht Muenchen, HRA 74606, Geschäftsfuehrung:
secnetix Verwaltungsgesellsch. mbH, Handelsreg.: Amtsgericht München,
HRB 125758, Geschäftsführer:  Maik Bachmann,  Olaf Erb,  Ralf Gebhart
FreeBSD-Dienstleistungen/-Produkte + mehr: http://www.secnetix.de/bsd
"File names are infinite in length, where infinity is set to 255 characters."
        -- Peter Collinson, "The Unix File System"
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 21 Mar 2014 - 15:07:45 CET

search this site