Jak znaleźć kodowanie bieżącego bufora w vimie?

89

Powiedzmy, że edytuję jakiś plik za pomocą vim (lub gvim). Nie mam pojęcia o kodowaniu pliku i chcę wiedzieć, czy jest on w UTF-8, ISO-8859-1, czy coś w tym stylu? Czy mogę jakoś powiedzieć vimowi, aby pokazał mi, jakie kodowanie jest używane?

innaM
źródło

Odpowiedzi:

104

Ustawienie kodowania pliku pokazuje kodowanie bieżącego bufora:

:set fileencoding
fileencoding=utf8

Naprawdę nie ma powszechnego sposobu określania kodowania pliku w postaci zwykłego tekstu, ponieważ te informacje nie są zapisywane w samym pliku - z wyjątkiem plików UTF-8, w których masz tak zwaną BOM, która wskazuje na kodowanie. Właśnie dlatego pliki xml i html mają metatagi charset.

Możesz wymusić określone kodowanie za pomocą ustawienia „kodowanie”. Zobacz :help encodingiw :help fileencodingVimie, jak edytor obsługuje te ustawienia. Możesz także dodać kilka ustawień kodowania plików do swojego vimrc, aby vim spróbował wykryć na podstawie tych wymienionych.

jtimberman
źródło
1
Doskonały. Nawet jeśli jest to nieco sprzeczne z intuicją. Dziękuję Ci!
innaM
7
Niestety nie jest poprawne. Bo Vim nie może znaleźć kodowania czytanego pliku. Nie jest zapisany w pliku. Może jedynie zgadywać na podstawie dostępnych znaków w pliku. Na przykład plik z tekstem „abcdef” może być w kilku kodowaniach, ponieważ praktycznie wszystkie obsługują te znaki, ale plik z „šđčćž” prawdopodobnie będzie w CP1252. Więc nie czytasz skądś kodowania, ale zgadujesz, co to może być kodowanie i na podstawie tego, że wyświetla je poprawnie.
Rook
6
To, co tu robisz, polega na jawnym ustawieniu kodowania na podstawie twoich obserwacji zawartości pliku. Jeśli chcesz, aby vim wypróbował kilka kodowań, podczas otwierania pliku umieść kilka z nich w opcji w _vimrc.
Rook
@ldigas, dzięki za opinie, zaktualizowałem odpowiedź, aby była nieco bardziej jasna na ten temat (mam nadzieję!)
jtimberman
2
Prawdopodobnie warto wspomnieć, że BOM są 1.) Nie są unikalne dla UTF-8 - chociaż UTF-8 różnią się od innych BOM, 2.) Nie są wymagane i często nie występują w UTF-8 .
ruffin
13

Zauważ, że kodowanie plików nie jest wyraźnie określone nigdzie w pliku. Dlatego VIM i inne aplikacje muszą odgadnąć kodowanie. Kanonicznym sposobem na to jest chardetaplikacja, którą można uruchomić z poziomu VIM w następujący sposób:

:!chardet %

Odpowiedź dostarczona przez jtimberman pokazuje kodowanie bieżącego bufora, które może nie być tym samym kodowaniem co plik na dysku. W ten sposób zauważysz, że chardetczasami będzie wyświetlać inne kodowanie niż VIM, szczególnie jeśli masz skonfigurowany VIM, aby zawsze używał określonego kodowania (np. UTF-8).

Zaletą chardetjest to, że daje ocenę pewności zgadywania, podczas gdy VIM może (i często ma) rację, zgadując kodowanie, jeśli nie ma wielu znaków powyżej \ x7F (ASCII 127). Na przykład dodanie pojedynczego אdo długiego pliku kodu PHP powoduje chardet, że plik ma ISO-8859-2pewność 0,72, podczas gdy dodanie nieco dłuższej frazy שלום, עולם!‏daje UTF-8 z wynikiem ufności 0,99. W obu przypadkach set fileencoding?pokazane UTF-8nie, ponieważ plik na dysku to UTF-8, ale ponieważ VIM jest skonfigurowany do wewnętrznego używania UTF-8.

dotancohen
źródło
Sugeruję wspomnienie słowa o dostępności chardet w różnych systemach operacyjnych.
Soundararajan
@Soundararajan: Prawdopodobnie nie jestem facetem, który o tym wspomina, ponieważ używam tylko Debiana i CentOS. Jeśli masz odpowiednie informacje, możesz edytować odpowiedź. Dzięki!
dotancohen
Nie widzę potrzeby, aby to zrobić wewnątrz VIM, lepiej zrobić to z zewnątrz: chardet <file>. Mimo to dobra sugestia.
Lepe
-1

Odkryłem, że: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Możesz ponownie załadować plik przy użyciu innego kodowania, jeśli Vim nie był w stanie wykryć poprawnego kodowania:

:e ++enc=<encoding>

gdzie encodingmoże byćcp850, ISO-8859-1, UTF-8, ...

Możesz użyć file yourfilenamedo znalezienia kodowania lub chardetect(dostarczonego python-chardetlub uchardetzależnie od twojej dystrybucji Linuksa), jak sugeruje dotancohen.

Pierre-Damien
źródło
To nie odpowiada na pytanie, jak znaleźć obecne kodowanie. Zamiast tego to polecenie wymusi inne kodowanie w buforze.
Ruslan