Wie kann ich die Standardcodierung von VIM auf UTF-8 einstellen?

62

Ich möchte zu einem Open-Source-Projekt beitragen, das übersetzte Zeichenfolgen bereitstellt. Eine ihrer Anforderungen ist, dass Mitwirkende UTF-8 als Kodierung für die PO-Dateien verwenden müssen.

Ich verwende VIM 7.3 unter Linux. Wie kann ich sicher sein, dass die VIM-Codierung auf UTF-8 eingestellt ist, damit ich die PO-Datei richtig bearbeiten und speichern kann?

Paolo
quelle

Antworten:

64

Wenn Vim eine vorhandene Datei liest, versucht es, die Dateicodierung zu erkennen. Beim Schreiben der Datei verwendet Vim die von ihm erkannte Dateicodierung (sofern Sie dies nicht anders angeben). Daher wird eine als UTF-8 erkannte Datei als UTF-8, eine als Latin-1 erkannte Datei als Latin-1 usw. geschrieben.

Standardmäßig ist der Erkennungsprozess grob. Es wird davon ausgegangen, dass jede Datei, die Sie mit Vim öffnen, Latin-1 ist, es sei denn, oben wird eine Unicode-Markierung für die Bytereihenfolge erkannt. Eine UTF-8-Datei ohne eine Markierung für die Bytereihenfolge kann nur schwer bearbeitet werden, da Multibyte-Zeichen im Puffer als Zeichenfolgen anstelle einzelner Zeichen angezeigt werden.

Schlimmer noch, Vim verwendet standardmäßig Latin-1, um den Text im Puffer darzustellen. Daher wird eine UTF-8-Datei mit einer Markierung für die Bytereihenfolge durch die Downkonvertierung nach Latin-1 beschädigt.

Die Lösung besteht darin, Vim für die interne Verwendung von UTF-8 zu konfigurieren. Dies wird in der Vim-Dokumentation empfohlen, und der einzige Grund, warum es nicht so konfiguriert ist, besteht darin, dass Benutzer, die davon ausgehen, dass Vim im Grunde genommen als Latin-1-Editor arbeitet, keine enorme Verwirrung stiften.

Fügen Sie in Ihrem Vim .vimrchinzu set encoding=utf-8und starten Sie es neu.

Oder setzen Sie stattdessen die LANGUmgebungsvariable, um anzugeben, dass UTF-8 Ihre bevorzugte Zeichenkodierung ist. Dies betrifft nicht nur Vim, sondern jede Software, die darauf angewiesen ist, LANGzu bestimmen, wie Text dargestellt werden soll. Um beispielsweise anzugeben, dass Text in Englisch ( en) angezeigt werden soll , wie in den USA ( US) gesprochen, und als UTF-8 ( utf-8) codiert , setzen LANG=en_US.utf-8.

Jetzt wird Vim UTF-8 verwenden, um den Text im Puffer darzustellen. Außerdem wird das Erkennen der UTF-8-Codierung in einer Datei entschlossener. Neben der Suche nach einer Markierung für die Bytereihenfolge wird auch nach UTF-8 ohne Markierung für die Bytereihenfolge gesucht, bevor auf Latin-1 zurückgegriffen wird. Daher wird eine in UTF-8 codierte Datei nicht mehr beschädigt, und die UTF-8-Zeichen sollten während der Editiersitzung ordnungsgemäß angezeigt werden.

Weitere Informationen dazu, wie Vim die Dateicodierung erkennt, finden Sie in der Vim-Dokumentation unter der fileencodingsOption .

Weitere Informationen zum Festlegen der Codierung, die Vim intern verwendet, finden Sie unter der encoding Option .

Wenn Sie die Codierung überschreiben müssen, die beim Zurückschreiben einer Datei auf die Festplatte verwendet wird, lesen Sie die fileencoding Option .

MetaEd
quelle
3
Eigentlich muss ich mich nicht einmal um die Bearbeitung kümmern .vimrc. Tatsächlich ist der Standardwert für die Codierung "latin1" oder der Wert von $ LANG, der in meinem System auf festgelegt ist en_US.UTF-8. Aus diesem Grund :set encodinggibt es encoding=utf-8out of the box. Wie erwartet, wenn LANG nicht gesetzt ist, :set encodinggibt encoding=latin1. Danke für die tolle Antwort!
Paolo
Das könnte allgemein nützlich sein, deshalb habe ich es der Antwort hinzugefügt.
MetaEd
Wenn Sie eine Datei öffnen, die als latin1 codiert ist, ändert diese Einstellung dann nicht die Dateicodierung? Wie kann man Vim dazu bringen, die Kodierung einer Datei intakt zu halten, aber für neue Dateien utf-8 zu bevorzugen?
David Kennedy
@DaveKennedy Vim kann die Datei nur dann als Latin-1 behandeln, wenn die Datei eindeutig Latin-1 ist. Wenn die Codierung nicht eindeutig ist, muss Vim wählen. Beispielsweise ist eine Datei, die nur 7-Bit-ASCII-Codes enthält, gültig für Latin1, aber auch für UTF-8 und andere. Eine solche Datei wird normalerweise als UTF-8 behandelt. Eine Möglichkeit, dieses Ergebnis zu vermeiden, besteht darin, die Dateicodierung eindeutig zu machen. Der Trick, den ich gesehen habe, besteht darin, eine Zeichenfolge von 0xF7-Codes hinzuzufügen. In UTF-8 ist 0xF7 ungültig. Aber in Latein-1 steht es für das Teilungszeichen (÷). Vim kommt normalerweise zu dem Schluss, dass die Datei Latin-1 ist.
MetaEd
4

Laut vimdoc versucht vim , die Dateicodierung automatisch zu erkennen. Wenn Sie also vorhandene Dateien bearbeiten, sollten Sie gut sein.

Sie können die Codierung jederzeit erzwingen, wenn Sie möchten :set fileencodings=utf-8. Die Dokumentation finden Sie hier .

Herr Shunz
quelle
6
fileencodings = utf-8 veranlasst Vim, die Eingabedatei als UTF-8 zu erkennen, führt dann jedoch eine verlustbehaftete Konvertierung nach Latin-1 durch. Außerdem kann Vim UTF-16 nicht erkennen. Die bessere Lösung ist das Setzen von encoding = utf-8, wodurch Vim von einem nativen Ein-Byte-Editor in einen nativen Multibyte-Editor verwandelt wird.
MetaEd
@MetaEd Sie beantworten können diese auf Ihrem Kommentar :) auszuarbeiten
hhh