Ich versuche zu lernen, wie sich die $LANG
Variable mit dem Gnome-Terminal (und seiner Voreinstellungsoption für die Zeichenkodierung) verhält. Ich habe iso8859-1 (latin1) als Hauptzeichensatz verwendet und alle meine Dateinamen sind als solche codiert.
Für die folgenden Tests werde ich ein ls -l
Verzeichnis mit Zeichen mit spanischem Akzent in ihren Dateinamen erstellen:
Fall 1:
- Gnome-Terminal konfiguriert für ISO-8859-1
LANG
auf "en_US-iso8859-1" setzen- Ergebnis: Ich sehe alle Dateien korrekt
Fall 2:
- Gnome-Terminal für UTF-8 konfiguriert
LANG
auf "en_US-iso8859-1" setzen- Ergebnis: Ich sehe Müllzeichen für alle spanischen Zeichen. Dies wird erwartet, da ich die Zeichenkodierung für das Terminal geändert habe
Fall 3:
- Gnome-Terminal konfiguriert für ISO-8859-1
LANG
auf "en_US-UTF-8" setzen- Ergebnis: Ich sehe Müllzeichen für alle spanischen Zeichen.
Warum sehe ich in diesem letzten Fall verstümmelte Zeichen? Sollte die Ausgabe von ls die Dateinamen nicht so wie sie sind direkt an das Gnome-Terminal senden? Und da das Gnome-Terminal für ISO-8859-1 konfiguriert ist, hätte ich erwartet, dass sie richtig aussehen.
Für einen Moment dachte ich, dass Bash vielleicht meine $LANG
Variable berücksichtigt und eine Konvertierung durchführt. Dann habe ich mein Terminal auf UTF-8 umgestellt, aber ich kann die Zeichen immer noch nicht richtig sehen. Ich habe sogar die Ausgabe von ls an xxd weitergeleitet und zu meiner Überraschung sehe ich die Dateien immer noch so codiert, wie sie sind: ISO-8859-1.
Zum Abschluss: Wenn mein Eintrag ISO-8859-1-Zeichen enthält und mein Terminalemulator für dieselbe Zeichencodierung konfiguriert ist: Wer führt die Konvertierung durch, wenn etwas LANG
anderes festgelegt ist?
Vielen Dank für jede Hilfe, die Sie leisten können.
Craconia
ls
Sinn gekommen , dass ich LC_CTYPE (in diesem Fall auf UTF-8 gesetzt) in Betracht ziehen und eine Art Zeichensatzvalidierung durchführen würde: Wenn es etwas sieht, das nicht mit dem Zeichensatz kompatibel ist, spuckt es ein bestimmtes Zeichen aus (z. B. "? "). Ich sagte "Validierung", weil es keine "Konvertierung" durchführt, wie es Luit tut. Ist es sols
die nicht druckbaren Zeichen durch?
. Die meisten in Latin-1 codierten Zeichenfolgen, die echte Wörter darstellen, haben nicht druckbare Zeichen, wenn sie als UTF-8 interpretiert werden.Im Fall Nr. 2 und Nr. 3 mischen Sie zwei verschiedene Codierungs-UTF-8 und Latin-1. In Fall 1 verwenden Sie Latin-1 für beide, sodass Sie kein Problem haben.
Der
ls
Befehl (und alle anderen gut verhaltenen Programme) verwenden die LANG-Einstellung zum Bestimmen der Codierung .Sie können zwei verschiedene Sprachen mischen , aber Sie sollten nicht zwei verschiedene Codierungen mischen .
Stellen Sie sicher, dass die Umgebungsvariablen LC_ * dieselbe Codierung wie Ihre LANG-Variable verwenden.
Als Faustregel sollten Sie Ihr System heutzutage so konfigurieren, dass nur UTF-8 verwendet wird.
Wenn Sie altmodische Datendateien (z. B. Java-Eigenschaften) bearbeiten müssen, sollten Sie entweder einen speziellen Editor (z. B. Java-Ide) verwenden oder die Codierung mit Tools wie
iconv
oder `recode .. sicherstellen.quelle
Dies könnte außerhalb Ihres Bedarfs liegen, aber ...
Es stellt sich heraus, dass RHEL5 und wahrscheinlich schon früher viele der Manpages aus irgendeinem gd vorausgegangenen Grund auf den neuesten Stand gebracht wurden. Das heißt, die rohe Manpage wurde von ihrem nativen Zeichensatz in 7-Bit-ASCII konvertiert. Unabhängig davon, was Sie mit LC und LANG tun, erstellt die Manpage für
latin1
eine Manpage, die praktisch unbrauchbar ist. Alle darin enthaltenen Sonderzeichen (8-Bit) wurden (normalerweise??
) durch 7-Bit-Platzhalter ersetzt . Ich finde das komisch.Die
utf8
Version dieser Manpages befindet sich jedoch möglicherweise im sprachspezifischen Verzeichnis. Der Trick besteht darin, sie mit ihrem richtigen Namen zu fragen. Zum Beispiel ist latin1 tatsächlichiso_8859-1
. Wenn Sie eine Manpage darauf erstellen und Ihre LANG-Einstellungen korrekt sind, sehen Sie, was Sie erwarten. Die Manpage befindet sich im sprachspezifischen Unterverzeichnis (en/man7/iso_8859-1.7
). Wenn Sie jedochiso-8859-1
aus irgendeinem Grund danach fragen , erhalten Sie die ASCII-Version.quelle