Как я могу установить кодировку VIM по умолчанию в UTF-8?

62

Я хотел бы внести свой вклад в проект с открытым исходным кодом, предоставляющий переведенные строки. Одним из их требований является то, что участники должны использовать UTF-8 в качестве кодировки для PO-файлов.

Я использую VIM 7.3 на Linux. Как я могу быть уверен, что кодировка VIM установлена ​​в UTF-8, чтобы я мог редактировать и сохранять файл .po правильным способом?

Paolo
источник

Ответы:

64

Когда Vim читает существующий файл, он пытается определить кодировку файла. При записи файла Vim использует обнаруженную кодировку файла (кроме случаев, когда вы говорите по-другому). Таким образом, файл, обнаруженный как UTF-8, записывается как UTF-8, файл, обнаруженный как Latin-1, записывается как Latin-1 и так далее.

По умолчанию процесс обнаружения является грубым. Предполагается, что каждый файл, который вы открываете с помощью Vim, будет Latin-1, если только он не обнаружит метку порядка байтов в Юникоде вверху. Файл UTF-8 без метки порядка байтов будет трудно редактировать, поскольку любые многобайтовые символы будут отображаться в буфере как последовательности символов, а не как отдельные символы.

Хуже того, Vim по умолчанию использует Latin-1 для представления текста в буфере. Таким образом, файл UTF-8 с меткой порядка байтов будет поврежден при преобразовании в Latin-1.

Решение состоит в том, чтобы настроить Vim для внутреннего использования UTF-8. Фактически это рекомендуется в документации Vim, и единственная причина, по которой он не настроен таким образом, - избегать путаницы среди пользователей, которые ожидают, что Vim будет работать в основном как редактор Latin-1.

В вашем .vimrc, добавьте set encoding=utf-8и перезапустите Vim.

Или вместо этого установите LANGпеременную окружения, чтобы указать, что UTF-8 является вашей предпочтительной кодировкой символов. Это повлияет не только на Vim, но и на любое программное обеспечение, которое LANGопределяет, как оно должно представлять текст. Например, чтобы указать, что текст должен отображаться на английском языке ( en), как говорят в Соединенных Штатах ( US), в кодировке UTF-8 ( utf-8), установите LANG=en_US.utf-8.

Теперь Vim будет использовать UTF-8 для представления текста в буфере. Кроме того, он также предпримет более решительные усилия для обнаружения кодировки UTF-8 в файле. Помимо поиска метки порядка байтов, он также проверит UTF-8 без метки порядка байтов, прежде чем вернуться к Latin-1. Таким образом, он больше не будет повреждать файл, закодированный в UTF-8, и должен правильно отображать символы UTF-8 во время сеанса редактирования.

Для получения дополнительной информации о том , как Вим определяет кодировку файла см в fileencodingsопцию в документации Vim .

Для получения дополнительной информации о настройке кодировки , что Вим использует внутренне, см в encoding опции .

Если вам необходимо изменить кодировку , используемую при записи файла на диск, см в fileencoding опции .

MetaEd
источник
3
На самом деле кажется, что мне даже не нужно беспокоиться о редактировании .vimrc; фактически значение кодировки по умолчанию - "latin1" или значение из $ LANG, которое в моей системе установлено в en_US.UTF-8. По этой причине :set encodingвыдает encoding=utf-8из коробки. Как и ожидалось, если LANG не установлен, :set encodingвыдает encoding=latin1. Спасибо за отличный ответ!
Паоло
Это может быть вообще полезно, поэтому я добавил его в ответ.
MetaEd
Если вы откроете файл, закодированный как latin1, не изменит ли этот параметр кодировку файла? Как вы можете заставить Vim сохранить кодировку файла без изменений, но предпочитать utf-8 для новых файлов?
Дэвид Кеннеди
@DaveKennedy Vim может обрабатывать файл как Latin-1, только если файл однозначно является Latin-1. Когда кодировка неоднозначна, Vim должен выбрать. Например, файл, содержащий только 7-битные коды ASCII, является допустимым Latin1, но это также допустимый UTF-8 и другие. Такой файл обычно рассматривается как UTF-8. Один из способов избежать этого - сделать кодировку файла однозначной. Уловка, которую я видел, состоит в том, чтобы добавить строку кодов 0xF7. В UTF-8 0xF7 недопустим. Но в латинице-1 он представляет знак деления (÷). Vim обычно приходит к выводу, что файл - Latin-1.
MetaEd
4

Согласно vimdoc, vim пытается автоматически определить кодировку файла, поэтому, если вы редактируете существующие файлы, вы должны быть хороши.

Вы всегда можете форсировать кодировку, если хотите :set fileencodings=utf-8. Вы можете найти документацию здесь .

Мистер Шунц
источник
6
fileencodings = utf-8 заставит Vim распознавать входной файл как UTF-8, но затем выполнить преобразование с потерями в Latin-1. Плюс это заставит Vim не распознавать UTF-16. Лучшее решение - установить encoding = utf-8, который превращает Vim из собственного однобайтового редактора в собственный многобайтовый редактор.
MetaEd
@MetaEd вы можете ответить на это , чтобы уточнить ваш комментарий :)
ххх