• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Umlaute und Zeichenkodierung de_DE + de_DE.UTF-8

halo44

Hacker
Ich habe mal wieder eine "dumme" Frage. Diesmal zur Zeichenkodierung.

Als Homebanking-Programm setze ich inzwischen Hibiscus ein. Leider kann ich damit ein bestimmtes Konto, welches ich bei der Targobank habe, nicht verwalten, da diese Bank kein HBCI anbietet.

Hier benutze ich das von der Bank angebotene Webbanking und downloade mir dort die Umsätze als csv-Datei. Diese Datei forme ich mit einem bash-Skript so um, dass ich die Umsätze in Hibiscus in ein dort angelegtes Offline-Konto importieren kann.

Hierbei gibt es allerdings einen kleinen "Schönheitsfehler": mein Bash-Skript eliminiert alle Umlaute, wenn ich nicht im Skript die Zeile
Code:
LANG="de_DE"
eingefügt habe.

Lese ich die exportierte Datei mit Kwrite ein, so werden alle Umlaute einwandfrei angezeigt, z.B.
Code:
25.07.2013;"VORAUSDATIERTE ÜBERWEISUNG Nr usw. usw. usw.

Gebe ich die Datei in der Konsole mit cat aus, so erhalte ich
Code:
25.07.2013;"VORAUSDATIERTE �BERWEISUNG Nr usw. usw. usw.

Die gleiche Ausgabe erhalte ich, wenn ich aus Dolphin unter Eigenschaften der Datei den Reiter "Vorschau" anklicke.

Bei Kwrite erfahre ich unter Einstellungen > Editor einrichten > Öffnen/Speichern > Allgemein, daß die Kodierung "Unicode (UTF-8)" ist. Zwei Zeilen tiefer wird allerdings als Standardkodierung "Westeuropäisch (ISO 8859-15)" angezeigt. Was heisst Kodierung und was Standardkodierung?

Auch erschliesst sich mir der feine Unterschied zwischen LANG="de_DE" und LANG="de_DE.UTF-8" nicht so auf Anhieb. Wie darf ich das alles verstehen?

Gruss H.
 

abgdf

Guru
Ach, das ist ein leidiges Thema.
Guck' mal mit "file datei", welches Encoding angezeigt wird (das wird tatsächlich nur geraten). Mein Tipp: "UTF-8 Unicode". Erwünscht ist wahrscheinlich "ISO-8559-1" (Latin 1). Du kannst die Datei umkodieren mit:
Code:
recode UTF-8..ISO-8859-1 datei
Aber mach' bitte vorher eine Sicherungskopie davon. ;)

Die richtige Anzeige hängt auch davon ab, worauf das System eingestellt ist. Das kann man sehr verborgen irgendwo bei den Ländereinstellungen im KDE-Kontrollcenter einstellen.
Moderne System sollten eigentlich auf UTF-8 eingestellt sein und damit umgehen können. In der Praxis klappt das aber nicht immer und "Latin 1" ist manchmal immer noch gefragt.
Ich hab' meinen älteren Rechner auf "Latin 1" und wenig Probleme, meinen neueren auf "UTF-8" und damit manchmal sehr wohl noch Probleme. Vielleicht gehe ich da auch wieder auf "Latin 1" (ISO-8559-1).

Die Theorie dahinter ist recht komplex und ich verstehe sie auch nicht, ich wurschtel mich eher so durch. Aber wenn Du willst, kannst Du Dich (mit leichtem Perl-Bezug) einlesen in:
Code:
perldoc perluniintro
 
OP
H

halo44

Hacker
Danke für Deine Hinweise.

Ein "file Datei" zeigt mir :
Code:
ISO-8859 text, with CRLF line terminators
Dies würde bedeuten, daß die Datei nicht mit UTF-8 rüberkommt, aber wohl von Kwrite darauf uminterpretiert wird, was die bash aber nicht macht.

Gut, dann ist vermutlich mein "LANG=de_DE" schon das Mittel der Wahl. Aber unschön ist das Ganze schon.

In den KDE-Ländereinstellungen finde ich nur Country Deutschland und Sprache Deutsch.

Gruss H.
 

panamajo

Guru
halo44 schrieb:
Ein "file Datei" zeigt mir :
Code:
ISO-8859 text, with CRLF line terminators
Dies würde bedeuten, daß die Datei nicht mit UTF-8 rüberkommt, aber wohl von Kwrite darauf uminterpretiert wird, was die bash aber nicht macht.
KWrite versucht (wenn es so eingestellt ist) das Encoding zu bestimmen. Wenn das scheitert wird die Standardkodierung verwendet (der Orginaltext trifft es besser: Fallback Encoding).
file liest den Dateianfang und versucht dadurch zu raten was das wohl ist. In deinem Fall besteht der Unterschied in der Repräsentation des Ü.
UTF-8: 2 Bytes, c39c
Latin1: 1 Byte, dc
Da ein einzelnes dc nie in validem UTF-8 vorkommen darf, die Bytesequenz c39c in Latin1 erlaubt ist dürfte die Datei tatsächlich in Latin1 sein.
halo44 schrieb:
In den KDE-Ländereinstellungen finde ich nur Country Deutschland und Sprache Deutsch.
Bei KDE müssen die entsprechenden Locale Pakete installiert werden (kde4-l10n-$LANGUAGE, wobei $LANGUAGE der ISO639-1 Sprachcode ist), dann stehen mehr Wahlmöglichkeiten zur Verfügung. Am Encoding ändert das allerdings nichts.
 

abgdf

Guru
panamajo schrieb:
Da ein einzelnes dc nie in validem UTF-8 vorkommen darf, die Bytesequenz c39c in Latin1 erlaubt ist dürfte die Datei tatsächlich in Latin1 sein.
Na gut, dann will er vielleicht UTF-8. Dann also entsprechend
Code:
recode ISO-8859-1..UTF-8 datei
 

josef-wien

Ultimate Guru
halo44 schrieb:
Auch erschliesst sich mir der feine Unterschied zwischen LANG="de_DE" und LANG="de_DE.UTF-8" nicht so auf Anhieb.
Im vorigen Jahrtausend, als von einem Datenaustausch oder gar einer Vernetzung der EDV noch lange keine Rede war, entstand eine Fülle von unterschiedlichen Zeichensätzen. Einerseits mußten die Besonderheiten der einzelnen Sprachen abgebildet werden, andererseits waren Hersteller immer schon dafür bekannt, mit Vorliebe eigene Suppen zu kochen (als ein bestimmter Hersteller zu seinem Betriebssystem DOS die grafische Oberfläche Windows einführte, hat er dafür auch einen ganz anderen Zeichensatz verwendet).

Um diesem Dilemma auszuweichen, wurde die UTF-Familie ersonnen, von der sich in der Praxis UTF-8 durchgesetzt hat. Jedes Familienmitglied besteht aus einem Zeichensatz, der die Zeichen sehr vieler Sprachen enthält und daher universell einsetzbar ist.

Dein System ist vermutlich auf de_DE.UTF-8 eingestellt (was Du mit dem Befehl locale überprüfen kannst). Intelligente Dateien verfügen über Informationen über den verwendeten Zeichensatz (so mancher Ersteller von Webseiten vergißt immer noch, diese wichtige Information zu definieren), eine simple Textdatei hat diese Information nicht. Ein verarbeitendes Programm muß also entweder raten, welcher Zeichensatz es sein könnte (und liegt dabei gar nicht so selten falsch), oder aber es verläßt sich darauf, daß ihm der Benutzer entsprechende Angaben macht, wenn es eine Abweichung vom Systemstandard gibt.

Hinter de_DE steckt der Zeichensatz ISO-8859-1, und der in Deinem Dokument verwendete Zeichensatz ist diesem zumindest soweit ähnlich, daß allfällige Unterschiede in der Praxis kaum auftreten. Die Alternative zur Angabe
halo44 schrieb:
in Deinem Skript ist die Umwandlung mit einem Programm wie recode oder iconv. Da es um Geldinformationen geht, ist de_DE@euro (dahinter steckt ISO-8859-15, also ISO-8859-1 mit dem zusätzlichen Euro-Zeichen) eventuell die bessere Wahl.
 
OP
H

halo44

Hacker
Vielen Dank an Euch alle drei. Mir ist die ganze Problematik jetzt doch wenigstens etwas klarer geworden.

Die Einstellung für $LANG "de_DE" und "de_DE@euro" bewirken bei meiner Anwendung beide das gleiche Ergebnis und ich kann die Datei korrekt verarbeiten.

Ich habe aber jetzt die Zeile
Code:
recode ISO-8859-1..UTF-8 datei
in mein Skript gebracht, weil auch diese Maßnahme die Erstellung einer sauberen Importdatei ermöglicht.

Da mein System UTF-8 erwartet, stelle ich mit dem recode dem Skript eine Datei bereit, die diese Erwartung erfüllt.

Gruss H.
 
Oben