Wie finde ich die Kodierung des aktuellen Puffers in vim?

65884
innaM

Angenommen, ich bearbeite eine Datei mit vim (oder gvim). Ich habe keine Ahnung von der Kodierung der Datei und möchte wissen, ob sie in UTF-8 oder ISO-8859-1 oder was auch immer ist? Kann ich vim irgendwie sagen, welche Kodierung verwendet wird?

81

2 Antworten auf die Frage

92
jtimberman

Die Einstellung für die Dateikodierung zeigt die Kodierung des aktuellen Puffers an:

:set fileencoding fileencoding=utf8 

Es gibt keine gängige Methode, um die Kodierung einer Klartextdatei zu bestimmen, da diese Informationen nicht in der Datei selbst gespeichert werden - außer bei UTF-8-Dateien, bei denen Sie eine sogenannte BOM haben, die die Kodierung angibt. Aus diesem Grund haben XML- und HTML-Dateien Zeichensatz-Metatags.

Sie können eine bestimmte Kodierung mit der Einstellung "Kodierung" erzwingen. Siehe :help encodingund :help fileencodingin Vim, wie der Editor diese Einstellungen behandelt. Sie können Ihrem vimrc auch mehrere Einstellungen für die Dateikodierung hinzufügen, damit vim anhand der aufgelisteten Einstellungen ermitteln kann.

Perfekt. Wenn auch etwas kontrapunktisch. Vielen Dank! innaM vor 14 Jahren 1
Leider nicht richtig. Vim kann die Kodierung der gerade gelesenen Datei nicht finden *. Es wird nicht in die Datei geschrieben. Es kann nur anhand der verfügbaren Zeichen in der Datei erraten werden. Zum Beispiel kann eine Datei mit dem Text "abcdef" mehrere Kodierungen enthalten, da praktisch alle diese Zeichen unterstützen, aber eine Datei mit "šđčćž" wird sich wahrscheinlich in CP1252 befinden. Sie lesen also die Kodierung nicht von irgendwo aus, sondern raten, welche Kodierung das sein könnte und basierend darauf, dass sie richtig angezeigt wird. Rook vor 14 Jahren 7
Was Sie hier tun, ist das explizite * Einstellen * der Kodierung, basierend auf Ihren Beobachtungen des Dateiinhalts. Wenn Sie möchten, dass vim mehrere Kodierungen ausführt, fügen Sie beim Öffnen einer Datei mehrere davon in die Option in Ihrem _vimrc ein. Rook vor 14 Jahren 6
@ ldigas, danke für das Feedback, ich habe die Antwort aktualisiert, um ein wenig klarer zu sein (hoffe ich!) jtimberman vor 14 Jahren 0
Ich wünschte nur, dass die Antwort so einfach wäre. Es ist nicht meine Antwort unten für den 'richtigen' Weg und die Erklärung. dotancohen vor 10 Jahren 0
Wahrscheinlich ist es erwähnenswert, dass die Stücklisten 1.) [Nicht eindeutig für UTF-8] (http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding) - obwohl UTF-8 sich von anderen Stücklisten unterscheidet, 2.) [ Nicht erforderlich und häufig nicht in UTF-8 gefunden] (http://en.wikipedia.org/wiki/Byte_order_mark#cite_ref-3). ruffin vor 9 Jahren 2
@jtimberman Wolltest du `set fileencoding 'schreiben (` mit einem nachgestellten Fragezeichen)? SeldomNeedy vor 7 Jahren 0
12
dotancohen

Beachten Sie, dass die Kodierung von Dateien an keiner Stelle in einer Datei explizit angegeben ist. Daher müssen VIM und andere Anwendungen die Kodierung erraten. Die kanonische Vorgehensweise dazu ist die chardetAnwendung, die von VIM aus so ausgeführt werden kann:

:!chardet % 

Die Antwort von jtimberman zeigt Ihnen die Kodierung des aktuellen Puffers, die möglicherweise nicht dieselbe Kodierung wie die Datei auf der Festplatte ist. Daher werden Sie feststellen, dass chardetmanchmal eine andere Codierung als VIM angezeigt wird, insbesondere wenn Sie VIM so konfiguriert haben, dass immer eine bestimmte Codierung (z. B. UTF-8) verwendet wird.

Das Schöne daran chardetist, dass es eine Vertrauensbewertung für seine Vermutung gibt, während VIM das Erraten der Kodierung falsch einschätzen kann (und oft auch falsch ist), wenn nicht viele Zeichen über \ x7F (ASCII 127) stehen. Wenn Sie beispielsweise אeiner langen Datei von PHP-Code eine einzelne hinzufügen, wird der Eindruck erweckt chardet, dass die Datei ISO-8859-2ein Vertrauensverhältnis von 0,72 hat, während das Hinzufügen des etwas längeren Ausdrucks שלום, עולם!‏UTF-8 mit einem Vertrauensfaktor von 0,99 ergibt. In beiden Fällen set fileencoding?zeigte UTF-8nicht, weil die Datei auf der Festplatte UTF-8 war, sondern weil VIM ist so konfiguriert, UTF-8 intern zu verwenden.

Ich schlage vor, Sie erwähnen ein Wort über die Verfügbarkeit von Chardet in allen Betriebssystemen. Soundararajan vor 5 Jahren 0
@Soundararajan: Ich bin wahrscheinlich nicht der Typ, der das erwähnt, da ich nur Debian und CentOS verwende. Wenn Sie über relevante Informationen verfügen, können Sie die Antwort jedoch bearbeiten. Vielen Dank! dotancohen vor 5 Jahren 0