Опции кодирования Vim

Хотя помощь Vim - это сокровищница информации, в некоторых случаях я нахожу ее мыслящей. Его объяснение различных вариантов, связанных с кодированием, является одним из таких случаев.

Может кто-нибудь, пожалуйста, объясните мне, простыми словами, что делают настройки кодировки, файла и файла, и как я могу a) просмотреть кодировку текущего файла?
б) изменить кодировку текущего файла?
c) делать что-то еще, что часто используется, но сейчас я молюсь о нем?

Ответ 1

  • encoding используется Vim, чтобы узнать, какие символы он поддерживает и как хранятся символы внутри.

    Вы не должны изменять этот параметр; он должен по умолчанию что-то Unicodeish. В противном случае вы не сможете читать и записывать файлы с расширенным набором символов.
    Поместите :set encoding=utf-8 в начале вашего vimrc, если вы не уверены, и никогда не будете играть с этим параметром заново, кроме случаев, когда вам нужно прочитать огромные файлы для одного сеанса с 1-байтовой кодировкой.

  • fileencoding хранит кодировку текущего буфера.
    Вы можете читать и записывать эту переменную, и она будет делать то, что вы хотите.
    Когда вы его измените, файл будет отмечен как измененный, а когда вы сохраните его (:w или :up) на диск, он будет записан с указанной вами кодировкой.

  • fileencodings сообщает Vim, как определить кодировку каждого прочитанного файла (чтобы определить значение fileencoding). Это список кодировок, которые проверены по порядку, и первая кодировка, совместимая с двоичным содержимым файла, считается кодировкой файла, который вы читаете.
    Установить его один раз, а затем забыть. Возможно, вам придется изменить его, если вы знаете, что собираетесь открывать большое количество файлов и что все они используют одну и ту же кодировку, и вы не хотите терять время, пытаясь проверить другие кодировки. Значение по умолчанию ucs-bom,utf8,latin1 является хорошим ИМО, если вы находитесь в Западной Европе, потому что почти любой файл будет открыт в правильной кодировке. Однако с этим параметром при открытии простых файлов ASCII (т.е. Представление байтов будет одинаковым в UTF8 и любой кодировке на кодовой странице на латинском языке), файл будет считаться UTF8 и сохранен как таковой.
    Пример: если вы установите fileencodings на latin1,utf8, каждый открытый файл будет считан как latin1, потому что попытка чтения файла с латинской кодировкой никогда не прерывается: существует биекция между 256 возможными байтовыми значениями и индивидуальным символов в наборе символов.
    И наоборот, если вы попробуете fileencodings=ucs-bom,utf8,latin1, Vim сначала проверит отметку байтового порядка и расшифрует Unicode файлы с BOM, а затем, если он не сработает (без спецификации), попробуйте прочитать ваши файлы в UTF-8, и если он не сработает (поскольку некоторые байтовые последовательности в UTF8 недействительны) откройте файл в latin1.

  • Чтобы перезагрузить файл с надлежащей кодировкой (случай, когда fileencodings не работал должным образом), вы можете сделать: :e! ++enc=<the_encoding>.

TL;DR:

  • просмотреть кодировку текущего файла: :echo &fileencoding (короче: :echo &fenc или :set fenc? или :verb set fenc?)
  • измените кодировку текущего файла: :set fenc=…... и вызовите :w столько раз, сколько хотите.
  • перезагрузите файл с помощью правильной кодировки: :e! ++enc=…

Ответ 2

Кодировка:
Внутреннее представление. Просмотр или установка с помощью:

:set encoding
:set encoding = utf-8

fileencoding:

Представление, которое будет использоваться при записи файла. Просмотр или установка с помощью:

:set fileencoding
:set fileencoding = utf-8

fileencodings:

Список возможных кодировок, проверенных при чтении файла. Просмотр или установка с помощью:

:set fileencodings
:set fileencodings= utf-8,latin-1,cp1251

Вот список возможных кодировок из документации vim (mbyte-encoding)

Supported 'encoding' values are:            *encoding-values*
1   latin1  8-bit characters (ISO 8859-1, also used for cp1252)
1   iso-8859-n  ISO_8859 variant (n = 2 to 15)
1   koi8-r  Russian
1   koi8-u  Ukrainian
1   macroman    MacRoman (Macintosh encoding)
1   8bit-{name} any 8-bit encoding (Vim specific name)
1   cp437   similar to iso-8859-1
1   cp737   similar to iso-8859-7
1   cp775   Baltic
1   cp850   similar to iso-8859-4
1   cp852   similar to iso-8859-1
1   cp855   similar to iso-8859-2
1   cp857   similar to iso-8859-5
1   cp860   similar to iso-8859-9
1   cp861   similar to iso-8859-1
1   cp862   similar to iso-8859-1
1   cp863   similar to iso-8859-8
1   cp865   similar to iso-8859-1
1   cp866   similar to iso-8859-5
1   cp869   similar to iso-8859-7
1   cp874   Thai
1   cp1250  Czech, Polish, etc.
1   cp1251  Cyrillic
1   cp1253  Greek
1   cp1254  Turkish
1   cp1255  Hebrew
1   cp1256  Arabic
1   cp1257  Baltic
1   cp1258  Vietnamese
1   cp{number}  MS-Windows: any installed single-byte codepage
2   cp932   Japanese (Windows only)
2   euc-jp  Japanese (Unix only)
2   sjis    Japanese (Unix only)
2   cp949   Korean (Unix and Windows)
2   euc-kr  Korean (Unix only)
2   cp936   simplified Chinese (Windows only)
2   euc-cn  simplified Chinese (Unix only)
2   cp950   traditional Chinese (on Unix alias for big5)
2   big5    traditional Chinese (on Windows alias for cp950)
2   euc-tw  traditional Chinese (Unix only)
2   2byte-{name} Unix: any double-byte encoding (Vim specific name)
2   cp{number}  MS-Windows: any installed double-byte codepage
u   utf-8   32 bit UTF-8 encoded Unicode (ISO/IEC 10646-1)
u   ucs-2   16 bit UCS-2 encoded Unicode (ISO/IEC 10646-1)
u   ucs-2le like ucs-2, little endian
u   utf-16  ucs-2 extended with double-words for more characters
u   utf-16le    like utf-16, little endian
u   ucs-4   32 bit UCS-4 encoded Unicode (ISO/IEC 10646-1)
u   ucs-4le like ucs-4, little endian

The {name} can be any encoding name that your system supports.  It is passed
to iconv() to convert between the encoding of the file and the current locale.
For MS-Windows "cp{number}" means using codepage {number}.
Examples:
    :set encoding=8bit-cp1252
    :set encoding=2byte-cp932

The MS-Windows codepage 1252 is very similar to latin1.  For practical reasons
the same encoding is used and it called latin1.  'isprint' can be used to
display the characters 0x80 - 0xA0 or not.

Several aliases can be used, they are translated to one of the names above.
An incomplete list:

1   ansi    same as latin1 (obsolete, for backward compatibility)
2   japan   Japanese: on Unix "euc-jp", on MS-Windows cp932
2   korea   Korean: on Unix "euc-kr", on MS-Windows cp949
2   prc     simplified Chinese: on Unix "euc-cn", on MS-Windows cp936
2   chinese     same as "prc"
2   taiwan  traditional Chinese: on Unix "euc-tw", on MS-Windows cp950
u   utf8    same as utf-8
u   unicode same as ucs-2
u   ucs2be  same as ucs-2 (big endian)
u   ucs-2be same as ucs-2 (big endian)
u   ucs-4be same as ucs-4 (big endian)
u   utf-32  same as ucs-4
u   utf-32le    same as ucs-4le
    default     stands for the default value of 'encoding', depends on the
    environment

For the UCS codes the byte order matters.  This is tricky, use UTF-8 whenever
you can. The default is to use big-endian (most significant byte comes
first):
    name    bytes       char 
    ucs-2         11 22     1122
    ucs-2le       22 11     1122
    ucs-4   11 22 33 44 11223344
    ucs-4le 44 33 22 11 11223344

On MS-Windows systems you often want to use "ucs-2le", because it uses little
endian UCS-2.

There are a few encodings which are similar, but not exactly the same.  Vim
treats them as if they were different encodings, so that conversion will be
done when needed.  You might want to use the similar name to avoid conversion
or when conversion is not possible:

    cp932, shift-jis, sjis
    cp936, euc-cn