Вы путаете 'encoding'
, который является глобальной настройкой Vim, и 'fileencoding'
, который является локальной настройкой для каждого буфера.
При открытии файла переменная 'fileencodings'
(обратите внимание на последний s ) определяет, с какими кодировками Vim будет пытаться открыть файл. Если он начинается с ucs-bom
, то любой файл с спецификацией будет правильно открыт при правильном разборе.
Если вы хотите изменить кодировку файла, вы должны использовать :set fenc=<foo>
. Если вы хотите удалить спецификацию, вы должны использовать :set [no]bomb
. Затем используйте :w
для сохранения.
Избегайте изменения enc
после открытия буфера, это может испортить вещи. enc
определяет, с какими символами может работать vim, и не имеет никакого отношения к файлам, с которыми вы работаете.
Подробнее
c:\> gvim umlaute.txt
Вы открываете vim с несуществующим именем файла. Vim создает буфер, дает ему это имя и устанавливает fenc
в пустое значение, поскольку с ним не связано ни одного файла.
:set enc
(кодировка эха VIM = latin1)
Это означает, что Vim хранит содержимое буфера в ISO-8859-1 (возможно, другое число).
и затем я проверяю кодировку файла ...
:set fenc
(VIM повторяет кодирование файла =)
Это нормально, на данный момент файла нет.
Затем я пишу файл
:w
Поскольку 'fileencoding'
пусто, он запишет его на диск, используя внутреннюю кодировку, latin1
.
И проверьте размер файла на жестком диске:
!dir umlaute.txt
(размер 5 байт). Конечно, ожидается, 3 байта для текста и 2 для \ x0a \ x0d.
Хорошо, теперь я установил кодировку на
:set enc=utf8
НЕПРАВИЛЬНО! Вы говорите vim, что он должен интерпретировать содержимое буфера как содержимое UTF8. буфер содержит в шестнадцатеричном формате e4 f6 fc 0a 0d
, первые три байта являются недопустимыми последовательностями символов UTF8. Вы должны набрать :set fenc=utf-8
. Это бы преобразовало буфер.
Буфер получился странным
Вот что происходит, когда вы заставляете Vim интерпретировать недопустимый файл UTF-8 как UTF8.
Полагаю, это шестнадцатеричное представление символов ascii, которые я ранее набрал. Поэтому я переписываю их
äöü
Запись, проверка размера:
:w
:$ dir umlaute.txt
На этот раз это 8 байтов. Я думаю, это имеет смысл 2 байта для каждого символа плюс \ x0d \ x0a.
Хорошо, я хочу убедиться, что в следующий раз, когда я открою файл, он будет открыт с помощью encodiung = utf8.
:set bomb
:w
: $ dir umlaute.txt
11 байт. Это, конечно, 8 (предыдущий) байт + 3 байта для спецификации (ef bb bf).
Итак, я
:quit
vim и снова откройте файл
и проверьте, установлена ли кодировка:
: установить в
Но VIM настаивает на своей кодировке = latin1.
Вы должны запустить set fenc?
, чтобы узнать, какова обнаруженная кодировка вашего файла. И если вы хотите, чтобы Vim мог работать с файлами Unicode, вы должны установить в своем vimrc, что 'enc'
- это utf-8.