Скажем, я редактирую какой-то файл с помощью vim (или gvim). Я понятия не имею о кодировке файла, и я хочу знать, находится ли он в UTF-8 или ISO-8859-1 или что-то еще? Могу ли я как-то сказать vim, чтобы показать мне, какая кодировка используется?
2 ответа на вопрос
92
jtimberman
Параметр fileencoding показывает кодировку текущего буфера:
:set fileencoding fileencoding=utf8
На самом деле не существует общего способа определения кодировки открытого текста, поскольку эта информация не сохраняется в самом файле - за исключением файлов UTF-8, где у вас есть так называемая спецификация, которая обозначает кодировку. Вот почему файлы xml и html имеют метатеги charset.
Вы можете применить определенную кодировку с помощью параметра «кодировка». Смотрите :help encodingи :help fileencodingв Vim о том, как редактор обрабатывает эти настройки. Вы также можете добавить несколько настроек кодирования файлов в ваш vimrc, чтобы vim попытался определить их на основе перечисленных.
Отлично. Даже если несколько противоречит интуиции. Спасибо!
innaM 15 лет назад
1
К сожалению, не правильно. Vim не может * найти * кодировку файла, который вы читаете. Это не написано в файле. Он может только догадываться на основе доступных символов в файле. Например, файл с текстом «abcdef» может быть в нескольких кодировках, поскольку практически все поддерживают эти символы, но файл с «šđčćž», скорее всего, будет в CP1252. Таким образом, вы не читаете кодировку откуда-то, а угадываете, какая это может быть кодировка, и исходя из этого, правильно ее отображаете.
Rook 15 лет назад
7
Здесь вы явно * устанавливаете * кодировку, основываясь на ваших наблюдениях за содержимым файла. Если вы хотите, чтобы vim попробовал несколько кодировок, при открытии файла укажите несколько из них в опции в вашем _vimrc.
Rook 15 лет назад
6
@ldigas, спасибо за отзыв, я обновил ответ, чтобы быть более ясным (надеюсь!)
jtimberman 15 лет назад
0
Я только хотел бы, чтобы ответ был таким легким. Это не так, см. Мой ответ ниже для «правильного» пути и объяснения.
dotancohen 10 лет назад
0
Вероятно, стоит упомянуть, что спецификации - это 1.) [Не уникально для UTF-8] (http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding) - хотя UTF-8 отличается от других спецификаций, 2.) [ Не требуется и часто не встречается в UTF-8] (http://en.wikipedia.org/wiki/Byte_order_mark#cite_ref-3).
ruffin 10 лет назад
2
@jtimberman Вы хотели написать `set fileencoding?` (с завершающим вопросительным знаком)?
SeldomNeedy 8 лет назад
0
12
dotancohen
Note that files' encoding is not explicitly stated anywhere in a file. Thus, VIM and other applications must guess at the encoding. The canonical way of doing this is with the chardet application, which can be run from within VIM as so:
:!chardet %
The answer provided by jtimberman shows you the encoding of the current buffer which may not be the same encoding as the file on disk. Thus, you will notice that chardet will sometimes show a different encoding than VIM, especially if you have VIM configured to always use a specific encoding (i.e. UTF-8).
The nice thing about chardet is that it gives a confidence score for its guess, whereas VIM can be (and often is) wrong about guessing the encoding if there are not many characters above \x7F (ASCII 127). For instance, adding a single א to a long file of PHP code makes chardet think that the file is ISO-8859-2 with a confidence of 0.72, whereas adding the slightly longer phrase שלום, עולם! gives UTF-8 with a confidence score of 0.99. In both cases, set fileencoding? showed UTF-8 not because the file on disk was UTF-8, but because VIM is configured to use UTF-8 internally.
Предлагаю вам упомянуть слово о наличии chardet в разных ОС.
Soundararajan 6 лет назад
0
@Soundararajan: Я, наверное, не тот парень, который упоминает об этом, поскольку я использую только Debian и CentOS. Вам предлагается отредактировать ответ, если у вас есть соответствующая информация. Спасибо!
dotancohen 6 лет назад
0