Як я можу встановити кодування за замовчуванням для VIM на UTF-8?


62

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

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

Відповіді:


64

Коли Vim читає наявний файл, він намагається виявити кодування файлу. Виписуючи файл, Vim використовує кодування файлу, який він виявив (за винятком випадків, коли ви розповідаєте інакше). Отже, файл, виявлений як UTF-8, пишеться як UTF-8, файл, виявлений як Latin-1, пишеться як Latin-1, і так далі.

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

Гірше, що Vim за замовчуванням використовує латинську-1 для подання тексту в буфері. Таким чином, файл UTF-8 із позначкою порядку байтів буде пошкоджений переходом вниз до латиниці-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 без позначки порядку байтів, перш ніж повернутися до латинської-1. Таким чином, він більше не пошкоджуватиме файл, закодований у UTF-8, і він повинен належним чином відображати символи UTF-8 під час сеансу редагування.

Для отримання додаткової інформації про те, як Vim виявляє кодування файлів, див . fileencodingsПараметр у документації Vim .

Для отримання додаткової інформації про налаштування кодування, яке Vim використовує внутрішньо, див . encoding Параметр .

Якщо вам потрібно змінити кодування, яке використовується під час запису файлу на диск, див . fileencoding Параметр .


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 може розглядати файл як латинську-1 лише тоді, коли файл однозначно є латинським-1. Коли кодування неоднозначне, Vim має вибрати. Наприклад, файл, що містить лише 7-бітні коди ASCII, є дійсним Latin1, але він також дійсний UTF-8 та інші. Такий файл, як правило, трактується як UTF-8. Один із способів уникнути цього результату - зробити кодування файлів однозначним. Я бачив трюк - додати рядок з кодами 0xF7. У UTF-8 0xF7 недійсний. Але в латинській-1 він являє собою знак поділу (÷). Vim звичайно зробить висновок, що файл є латинським-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 Ви можете відповісти на це, щоб детальніше розглянути свій коментар :)
hhh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.