Praxistips: Umlaute usw. in Shell-Skripten umkodieren

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

Nach der Umlaut- und Kodierungsdebatte mal ein paar kleine
Tips für Shell-Skript-Programmierer, um mal wieder ein
bisschen on-topic zu werden ... :)

Mit folgendem Kommando kann man in einem Shell-Skript die
Zeichenkodierung herausfinden:

CHARSET=$(locale charmap)

Die Variable CHARSET enthält dann z.B. "ISO8859-15" oder
"UTF-8".

Wenn man dann im Skript einen Text verarbeiten bzw. ausgeben
muss, der UTF-8-kodiert ist, dann kann man folgende Sequenz
verwenden:

.. | iconv -f UTF-8 -t $CHARSET --unicode-subst='<0x%04x>'

(-f steht für "from", -t steht für "to".)

Der Vorteil ist, dass das mit jeder Kodierung funktioniert,
d.h. man kann das Skript unverändert auf Systemen mit
unterschiedlichen Kodierungen verwenden. Auch wenn man
seine Shell-Sessions später mal umstellt, muss man nichts
ändern.

Wenn irgendwelche Zeichen nicht konvertiert werden können,
weil es sie in der Kodierung des Terminals nicht gibt, wird
der Unicode-Wert hexadezimal ausgegeben, z.B. "<0x0446>"
(ein kyrillischer Buchstabe). Das Format kann man anpassen
(Option --unicode-subst, siehe oben).

Folgender Schnipsel stellt anhand der BOM fest, ob eine Datei
UTF-8-kodiert ist:

BOM="$(dd bs=3 count=1 2>/dev/null <DATEI)"
if [ $(echo -n "$BOM" | hexdump -e '1/1 "%02x"') = efbbbf ]; then
        HAS_UTF8_BOM=true
        FILE_CODING=UTF-8
else
        HAS_UTF8_BOM=false
fi

Wenn eine solche BOM vorhanden ist, ist die Datei auf jeden
Fall UTF-8-kodiert. Allerdings ist die BOM nicht zwingend
vorgeschrieben, d.h. auch wenn sie fehlt, könnte es trotzdem
UTF-8 sein.

Das Skript könnte dann einmal testweise die Datei als UTF-8
interpretieren (d.h. mit iconv nach /dev/null) und schauen,
ob das mit einem Fehler abbricht oder nicht:

if iconv -f UTF-8 -t UCS-4 <DATEI >/dev/null 2>&1; then
else
        FILE_CODING=ISO8859-15
fi

Das ist jetzt natürlich etwas vereinfacht und berücksichtigt
keine anderen Kodierungen, aber für den "Hausgebrauch" mit
deutschsprachigen Texten genügt das.

Ich hoffe, das hilft dem einen oder anderen weiter, der sich
in Shell-Skripten mit so etwas auseinandersetzen muss.

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
C++: "an octopus made by nailing extra legs onto a dog"
        -- Steve Taylor, 1998
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 - 11:28:38 CET

search this site