Как мне найти кодировку текущего буфера в vim?


89

Скажем, я редактирую какой-то файл с помощью vim (или gvim). Я понятия не имею о кодировке файла, и я хочу знать, находится ли он в UTF-8 или ISO-8859-1 или что-то еще? Могу ли я как-то сказать vim, чтобы показать мне, какая кодировка используется?

Ответы:


104

Параметр fileencoding показывает кодировку текущего буфера:

:set fileencoding
fileencoding=utf8

На самом деле не существует общего способа определения кодировки открытого текста, поскольку эта информация не сохраняется в самом файле - за исключением файлов UTF-8, где у вас есть так называемая спецификация, которая обозначает кодировку. Вот почему файлы xml и html имеют метатеги charset.

Вы можете применить определенную кодировку с помощью параметра «кодировка». Смотрите :help encodingи :help fileencodingв Vim о том, как редактор обрабатывает эти настройки. Вы также можете добавить несколько настроек кодирования файлов в ваш vimrc, чтобы vim попытался определить их на основе перечисленных.


1
Отлично. Даже если несколько противоречит интуиции. Спасибо!
ИннаМ

7
К сожалению, не правильно. Vim не может найти кодировку файла, который вы читаете. Это не написано в файле. Он может только догадываться на основе доступных символов в файле. Например, файл с текстом «abcdef» может иметь несколько кодировок, поскольку практически все поддерживают эти символы, но файл с «šđčćž», скорее всего, будет в CP1252. Таким образом, вы не читаете кодировку откуда-то, а угадываете, что это может быть за кодировка, и исходя из этого, правильно ее отображаете.
Ладья

6
Здесь вы явно устанавливаете кодировку, основываясь на ваших наблюдениях за содержимым файла. Если вы хотите, чтобы vim попробовал несколько кодировок, при открытии файла поместите несколько из них в опцию в вашем _vimrc.
Ладья

@ldigas, спасибо за отзыв, я обновил ответ, чтобы быть немного более ясным об этом (я надеюсь!)
jtimberman

2
Вероятно, стоит упомянуть, что спецификации 1.) Не уникальны для UTF-8 - хотя UTF-8 отличается от других спецификаций 2.) Не требуется и часто не встречается в UTF-8 .
ruffin

13

Обратите внимание, что кодировка файлов явно не указана нигде в файле. Таким образом, VIM и другие приложения должны угадать кодировку. Канонический способ сделать это с chardetприложением, которое можно запустить из VIM следующим образом:

:!chardet %

Ответ, предоставленный jtimberman, показывает кодировку текущего буфера, которая может не совпадать с кодировкой файла на диске. Таким образом, вы заметите, что chardetиногда будет отображаться кодировка, отличная от VIM, особенно если VIM настроен на постоянное использование определенной кодировки (т. Е. UTF-8).

Хорошая вещь в chardetтом, что он дает оценку достоверности для своего предположения, тогда как VIM может (и часто ошибается) ошибаться в предположении кодировки, если не много символов над \ x7F (ASCII 127). Например, добавление одного אк длинному файлу кода PHP заставляет chardetдумать, что файл имеет ISO-8859-2достоверность 0,72, тогда как добавление немного более длинной фразы שלום, עולם!‏дает UTF-8 с показателем достоверности 0,99. В обоих случаях set fileencoding?показывалось UTF-8не потому, что файл на диске был UTF-8, а потому, что VIM настроен для внутреннего использования UTF-8.


Предлагаю вам упомянуть слово о наличии chardet в разных ОС.
Soundararajan

@Soundararajan: Я, наверное, не тот парень, который упоминает об этом, поскольку я использую только Debian и CentOS. Вам предлагается отредактировать ответ, если у вас есть соответствующая информация. Спасибо!
dotancohen

Я не вижу необходимости делать это внутри VIM, лучше делать это снаружи chardet <file>. Тем не менее, хорошее предложение.
Лепе

-1

Я обнаружил, что: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Вы можете перезагрузить файл, используя другую кодировку, если Vim не смог определить правильную кодировку:

:e ++enc=<encoding>

где encodingможет бытьcp850, ISO-8859-1, UTF-8, ...

Вы можете использовать, file yourfilenameчтобы найти кодировку или chardetect(предоставляемую python-chardetили uchardetзависящую от вашего дистрибутива Linux) в соответствии с предложением dotancohen.


Это не отвечает на вопрос, как узнать текущую кодировку. Вместо этого эта команда будет принудительно использовать другую кодировку в буфере.
Руслан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.