Як знайти кодування поточного буфера в vim?


89

Скажімо, я редагую якийсь файл із vim (або gvim). Я не маю поняття про кодування файлу, і я хочу знати, чи він знаходиться в UTF-8 чи ISO-8859-1 чи що завгодно? Чи можу я якось сказати vim, щоб він показав мені, яке кодування використовується?

Відповіді:


104

Параметр кодування файлів показує кодування поточного буфера:

:set fileencoding
fileencoding=utf8

Насправді не існує загального способу визначення кодування файлу в простому тексті, оскільки ця інформація не зберігається у самому файлі - крім файлів UTF-8, де у вас є так звана BOM, яка вказує на кодування. Ось чому файли xml та html мають метатеги шаблону.

Ви можете застосувати певне кодування за допомогою параметра "кодування". Див. :help encodingТа :help fileencodingу Vim, як редактор обробляє ці налаштування. Ви також можете додати кілька налаштувань кодування файлів до свого vimrc, щоб мати змогу виявити vim на основі перелічених.


1
Ідеально. Навіть якщо дещо суперечить інтуїтивно зрозумілим. Дякую!
innaM

7
На жаль, не правильно. Для Vim не вдається знайти кодування файлу, який ви читаєте. Це не записано у файл. Він може здогадуватися лише на основі наявних символів у файлі. Наприклад, файл з текстом "abcdef" може містити декілька кодувань, оскільки практично всі підтримують ці символи, але файл із "šđčćž", ймовірно, буде в CP1252. Отже, ви не читаєте кодування звідкись, але здогадуєтесь, що таке кодування могло б бути, і виходячи з того, що його правильно відображати.
Грак

6
Що ви тут робите, - це чітко встановити кодування на основі ваших спостережень за вмістом файлу. Якщо ви хочете, щоб вим намагався спробувати кілька кодування, відкриваючи файл, покладіть декілька з них у параметр у вашому _vimrc.
Грак

@ldigas, дякую за відгуки, я оновив відповідь, щоб бути трохи більш зрозумілим щодо цього (сподіваюся!)
jtimberman

2
Напевно, варто згадати, що BOM - це 1.) Не характерно для UTF-8 - хоча UTF-8 відрізняється від інших BOM, 2.) Не вимагається і часто не зустрічається в UTF-8 .
ruffin

13

Зауважте, що кодування файлів явно не вказано ніде у файлі. Таким чином, VIM та інші програми повинні вгадувати при кодуванні. Канонічний спосіб зробити це з chardetдодатком, який можна запустити з VIM так:

:!chardet %

Відповідь, надана jtimberman, показує вам кодування поточного буфера, яке може бути не таким же кодуванням, як файл на диску. Таким чином, ви помітите, що chardetіноді буде показано інше кодування, ніж VIM, особливо якщо у вас VIM налаштований завжди використовувати певне кодування (тобто UTF-8).

Приємно в тому chardet, що він дає оцінку впевненості для своїх здогадок, тоді як VIM може помилятися в тому, щоб відгадати кодування, якщо символів вище \ x7F (ASCII 127) не так багато. Наприклад, додавання одного אдо довгого файлу PHP-коду змушує chardetдумати, що файл ISO-8859-2із достовірністю 0,72, тоді як додавання трохи довшої фрази שלום, עולם!‏дає UTF-8 з оцінкою довіри 0,99. В обох випадках set fileencoding?показано UTF-8не тому, що файл на диску був UTF-8, а тому, що VIM налаштований на внутрішнє використання UTF-8.


Я пропоную вам згадати слово про наявність шардету в ОС.
Soundararajan

@Soundararajan: Я, мабуть, не той хлопець, щоб згадувати про те, як я використовую лише Debian і CentOS. Вас пропонують відредагувати, якщо у вас є відповідна інформація. Дякую!
dotancohen

Я не бачу необхідності робити що всередині VIM, краще зробити це зовні: chardet <file>. Все-таки гарна пропозиція.
лепе

-1

Я виявив, що: https://vim.fandom.com/wiki/Reloading_a_file_using_a_different_encoding

Ви можете завантажити файл, використовуючи інше кодування, якщо Vim не зміг виявити правильне кодування:

:e ++enc=<encoding>

де encodingміг би бутиcp850, ISO-8859-1, UTF-8, ...

Ви можете використовувати file yourfilenameдля пошуку кодування або chardetect(надається python-chardetабо uchardetзалежно від вашого дистрибутива Linux), як запропоновано dotancohen.


Це не відповідає на питання, як знайти поточне кодування. Натомість ця команда примусить деяке інше кодування на буфері.
Руслан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.