Почему VIM игнорирует спецификацию моего файла? - PullRequest
5 голосов
/ 26 августа 2011

Мне нужен файл, который я хочу убедиться, что он закодирован как utf8 .

Итак, я создаю файл

c:\> gvim umlaute.txt

В VIM я набираю Umlaute:

äöü

Я проверяю кодировку ...

:set enc

(эхо VIM encoding=latin1)

и затем я проверяю кодировку файла ...

:set fenc

(эхо VIM fileencoding=)

Затем я пишу файл

:w

И проверьте размер файла на жестком диске:

!dir umlaute.txt

(размер 5 байт). Конечно, ожидается, 3 байта для текста и 2 для \ x0a \ x0d.

Хорошо, теперь я установил кодировку на

:set enc=utf8

Буфер получился странным

<e4><f6><fc>

Полагаю, это шестнадцатеричное представление символов ascii, которые я ранее набрал. Поэтому я переписываю их

äöü

Письмо, проверка размера:

:w
:$ dir umlaute.txt

На этот раз это 8 байтов. Я думаю, это имеет смысл 2 байта для каждого символа плюс \ x0d \ x0a.

Хорошо, поэтому я хочу убедиться, что в следующий раз, когда я открою файл, он будет открыт с помощью encodiung = utf8.

:setb
:w

:$ dir umlaute.txt

11 байт. Это, конечно, 8 (предыдущий) байт + 3 байта для спецификации (ef bb bf).

Итак, я

:quit

vim и снова откройте файл

и проверьте, установлена ​​ли кодировка:

:set enc

Но VIM настаивает на encoding=latin1.

Итак, почему это так? Я ожидал, что спецификация скажет VIM, что это файл UTF8.

Ответы [ 3 ]

16 голосов
/ 26 августа 2011

Вы путаете '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.

3 голосов
/ 22 декабря 2011

После многих попыток я получаю рабочий пример:

    setglobal bomb 
    set fileencodings=ucs-bom,utf-8,cp1251,koi8-r,cp866
    set nobin
    set fileencoding=utf-8 bomb

, и если вы хотите создать новое поле с помощью спецификации:

    c:\gvim umlaute.txt

, он работает сейчас!

0 голосов
/ 26 августа 2011

:help bomb раскрывает следующую информацию:

При записи файла и выполнении следующих условий к файлу добавляется спецификация (метка порядка байтов):

  • эта опция включена (правка: то есть ': установить бомбу')
  • опция 'бинарная' выключена
  • 'fileencoding' равен "utf-8", "ucs-2"," ucs-4 "или один из вариантов" маленький / большой порядок байтов ".

Некоторые приложения используют спецификацию для распознавания кодировки файла.Часто используется для файлов UCS-2 в MS-Windows.Для других приложений это вызывает проблемы, например: «cat file1 file2» заставляет спецификацию файла file2 показываться на полпути в результирующем файле.Gcc не принимает спецификациюКогда Vim читает файл и «fileencodings» начинается с «ucs-bom», выполняется проверка на наличие спецификации и соответственно устанавливается «бомба».Если «двоичный» не установлен, он удаляется из первой строки, так что вы не видите его при редактировании.Если вы не измените параметры, спецификация будет восстановлена ​​при записи файла.

Поэтому попробуйте установить это в вашем .vimrc:

set fileencodings=ucs-bom,utf-8,latin1
set nobin
setglobal fileencoding=utf-8
...