Re: locale Verwirrungen

From: Oliver Fromme <olli(at)lurza.secnetix.de>
Date: Fri, 20 Feb 2004 15:13:59 +0100 (CET)

Peter Wullinger <some-mail-drop(at)gmx.net> wrote:
> On Fri, Feb 20, 2004 at 11:34:52AM +0100, Oliver Fromme wrote:
> > Ulrich Spoerlein <q(at)uni.de> wrote:
> > > I versuche gerade herrauszufinden, warum 'ps' darauf besteht am/pm
> > > auszugeben, obwohl ich z.B. LC_TIME=de_DE.ISO8859-1 definiert habe.
> >
> > Weil der Programmierer, der das "use_ampm"-Feature in
> > src/bin/ps/print.c eingebaut hat, nicht verstanden hat,
> > wie nl_langinfo funktioniert. :-)
> >
> > -- snip --
>
> Verstanden hat er sie imho schon.

Nein, denn seine Methode, die Variable use_ampm zu initia-
lisieren, ist »bogus«.

> Nur hat er das Problem,
> daß er die Uhrzeit irgendwie auf die Spaltenbreite des
> "start"-Feldes begrenzen mußte/wollte.

Nunja, das gleiche Problem wie mit Datum/Zeit bei »ls -l«.
Aber das hat er bereits durch eine Fallunterscheidung ge-
löst, ganz ähnlich wie bei ls. Das hat aber nichts damit
zu tun, ob er 12- oder 24-Stunden-Format verwendet. Die
Spaltenbreite ist so gewählt, daß beides hineinpassen wür-
de.

> Am sinnvollsten wäre vielleicht ein strlen(), und bei
> zu großer Länge dann anders neu berechnen.

Das wäre ziemlich aufwendig und hätte kaum einen Nutzen.
Meiner Meinung nach wäre es am einfachsten, grundsätzlich
24-Stunden-Format zu verwenden, wie es ls ebenfalls tut.

Davon abgesehen sollte /bin/ps meiner Meinung nach besser
überhaupt nicht setlocale() aufrufen. Es gibt Skripte,
die versuchen, Ausgaben von ps zu parsen, und die mögli-
cherweise Fehlfunktionen haben, wenn das Format durch ein
nicht-standard-Locale nicht den Erwartungen des Skript-
Schreibers entspricht. (Zugegebenermaßen sind solche
Skripte ziemlicher Pfusch. Aber Pfusch existiert leider,
und man muß damit leben. Aus diesem Grund habe ich bei
mir meistens LC_CTYPE=en_US.ISO8859-1 gesetzt, und die
anderen LC_* und LANG lasse ich ungesetzt.)

> PS.: Gibt es eigentlich eine portable Methode, die Zeichenzahl (!)
> in einem nicht-ASCII String herauszufinden?

Was genau meinst Du mit nicht-ASCII-String? Falls Du
multibyte-character-strings meinst, siehe die multibyte(3)
manpage.

Falls Du mit irgendwelchen Encodings arbeitest (UTF-* oder
sonstwas), dann ist es wohl das einfachste, Du konvertierst
es zunächst nach Unicode bzw. ISO10646, denn dann hast Du
eine konstante Anzahl von Bytes pro Zeichen, und dividierst
dann die Anzahl der Bytes durch 2 (oder 4).

Gruß
   Olli

-- 
Oliver Fromme, secnetix GmbH & Co KG, Oettingenstr. 2, 80538 München
Any opinions expressed in this message may be personal to the author
and may not necessarily reflect the opinions of secnetix in any way.
"... there are two ways of constructing a software design:  One way
is to make it so simple that there are _obviously_ no deficiencies and
the other way is to make it so complicated that there are no _obvious_
deficiencies."        -- C.A.R. Hoare, ACM Turing Award Lecture, 1980
To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Fri 20 Feb 2004 - 15:21:15 CET

search this site