Wie finde ich die Kodierung des aktuellen Puffers in vim?

89

Angenommen, ich bearbeite eine Datei mit vim (oder gvim). Ich habe keine Ahnung von der Kodierung der Datei und möchte wissen, ob es sich um UTF-8 oder ISO-8859-1 handelt oder was auch immer? Kann ich vim irgendwie anweisen, mir zu zeigen, welche Codierung verwendet wird?

innaM
quelle

Antworten:

104

Die Einstellung für die Dateicodierung zeigt die Codierung des aktuellen Puffers an:

:set fileencoding
fileencoding=utf8

Es gibt wirklich keine übliche Methode, um die Codierung einer Klartextdatei zu bestimmen, da diese Informationen nicht in der Datei selbst gespeichert werden - mit Ausnahme von UTF-8-Dateien, bei denen eine sogenannte Stückliste vorhanden ist, die die Codierung 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 mit diesen Einstellungen umgeht. Sie können Ihrem vimrc auch mehrere Dateicodierungseinstellungen hinzufügen, damit vim versucht, anhand der aufgelisteten Einstellungen zu ermitteln.

jtimberman
quelle
1
Perfekt. Auch wenn etwas kontraintuitiv. Danke!
24.
7
Leider nicht richtig. Denn Vim kann die Kodierung der Datei, die Sie lesen, nicht finden . Es ist nicht in die Datei geschrieben. Es kann nur anhand der verfügbaren Zeichen in der Datei erraten werden. Beispielsweise kann eine Datei mit dem Text "abcdef" in mehreren Codierungen vorliegen, da praktisch alle diese Zeichen unterstützen. Eine Datei mit "šđčćž" befindet sich jedoch wahrscheinlich in CP1252. Sie lesen die Codierung also nicht von irgendwoher, sondern raten, welche Codierung dies sein könnte, und basieren darauf, dass sie ordnungsgemäß angezeigt wird.
Turm
6
Was Sie hier tun, ist das explizite Festlegen der Codierung basierend auf Ihren Beobachtungen des Inhalts der Datei. Wenn Sie möchten, dass vim beim Öffnen einer Datei mehrere Codierungen ausführt, fügen Sie mehrere davon in die Option in Ihrem _vimrc ein.
Turm
@ldigas, danke für das Feedback, ich habe die Antwort aktualisiert, um
diesbezüglich
2
Wahrscheinlich erwähnenswert, dass Stücklisten 1.) Nicht nur in UTF-8 vorhanden sind - obwohl sich UTF-8 von anderen Stücklisten unterscheidet. 2.) Nicht erforderlich und häufig in UTF-8 nicht vorhanden .
Ruffin
13

Beachten Sie, dass die Kodierung von Dateien an keiner Stelle in einer Datei explizit angegeben wird . Daher müssen VIM und andere Anwendungen die Codierung erraten. Die kanonische Methode hierfür ist die chardetAnwendung, die in VIM folgendermaßen ausgeführt werden kann:

:!chardet %

Die Antwort von jtimberman zeigt Ihnen die Kodierung des aktuellen Puffers, die möglicherweise nicht mit der Kodierung der Datei auf der Festplatte übereinstimmt . 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 verwendet wird (z. B. UTF-8).

Das Schöne daran chardetist, dass es eine Konfidenzbewertung für seine Vermutung gibt, während VIM bei der Vermutung der Codierung falsch sein kann (und oft auch falsch ist), wenn es nicht viele Zeichen über \ x7F (ASCII 127) gibt. Wenn Sie beispielsweise eine einzelne אDatei zu einer langen Datei mit PHP-Code hinzufügen, wird angenommen chardet, dass die Datei ISO-8859-2mit einem Konfidenzniveau von 0,72 vorliegt , wohingegen das Hinzufügen der etwas längeren Phrase שלום, עולם!‏UTF-8 mit einem Konfidenzniveau 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.

dotancohen
quelle
Ich schlage vor, Sie erwähnen ein Wort über die Verfügbarkeit von Chardet unter den Betriebssystemen.
Soundararajan
@Soundararajan: Ich bin wahrscheinlich nicht der Typ, der das erwähnt, da ich nur Debian und CentOS verwende. Sie werden jedoch aufgefordert, die Antwort zu bearbeiten, wenn Sie relevante Informationen haben. Vielen Dank!
Dotancohen
Ich sehe nicht die Notwendigkeit , dass im Innern VIM zu tun, besser , es zu tun von außen: chardet <file>. Trotzdem guter Vorschlag.
Lepre
-1

Ich habe folgendes gefunden: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Sie können eine Datei mit einer anderen Codierung erneut laden, wenn Vim die richtige Codierung nicht erkennen konnte:

:e ++enc=<encoding>

wo encodingkönnte seincp850, ISO-8859-1, UTF-8, ...

Sie können verwenden file yourfilename, um die von dotancohen vorgeschlagene Codierung oder chardetect(bereitgestellt von python-chardetoder uchardetabhängig von Ihrer Linux-Distribution) zu finden.

Pierre-Damien
quelle
Dies beantwortet nicht die Frage, wie die aktuelle Codierung ermittelt werden kann. Stattdessen erzwingt dieser Befehl eine andere Codierung im Puffer.
Ruslan