anonymous@RULINUX.NET~# Last login: 2024-12-25 22:21:19
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]

баян: vim и multibyte encoding

Скрыть

жевание соплей по работе с различными кодировками файлов в vim. кто прошарен - идёт лесом или пишет Ъ камменты. остальным - можно пофтыкать, можно не фтыкать, можно аффтару стчку на телефон или обложить аффтара хуями. можно и не обкладывать, аффтар не абидицца.

цимес в том, что vim-у кодировка редактируемого файла не важна, а встречается всяко-разное. при сбое автоопределения единицы позволяют указывать кодировку файла вручную. соответственно задача редактирования файла в исходной кодировке порой требует наличия мозгов в межплечевой жопе. что не может не радовать.

типовые утилиты для работы с кодировками:

$ recode
$ iconv
$ enca
$ chardet или же chardetect.py

последний позволяет "угадывать" возможные варианты кодировок. must have.

открываем vim, печатаем:

vim

:h enc  
 
" можно и нужно читать. читать не просто так, а пройти по всем "ссылкам". даёт понять как vim работает с кодировками и что для этого использует. если очень грубо "просуммировать" - получим следующие четыре "внутренних" переменных vim, позволяющих худо-бедно оперировать кодировками. важно учитывать опции сборки vim (+multi_byte) и понимать, что: "The conversion is done with iconv() or as specified with 'charconvert'."(ц)(vim).

vim

:set encoding  "  показывает в какой кодировке vim работает по умолчанию (именно сейчас)
:set termencoding  "
 показывает в какой кодировке vim ожидает работу своего терминала
:set fileencoding  "  показывает в какой кодировке vim открыл рабочий файл
:set fileencodings  "
 показывает список кодировок, в которых vim ожидает найти соответствующую открываемому файлу. первая "подходящая" принимается в работу. следствие: если первой стоит "latin1", то про "угадывание" кодировок забываем. именно тут корни многих ошибок в правильном определении кодировки рабочего файла.
 
допустим, что vim работает в UTF-8 окружении. пример записей в ~/.vimrc:
vim

" рабочая кодировка
set encoding=utf-8
" кодировка терминала
set termencoding=utf-8
" список кодировок файлов для автоопределения
set fileencodings=ucs-bom,utf-8,cp1251,koi8-r,iso-8859-5,cp866,ucs-2,ucs-2le,utf-16,utf-16le,latin1
 
fileencoding определяет сам vim, исходя из результатов записей в ~/.vimrc : UTF - лехко, а из 8-ми битных кодировок корректно отобразит лишь cp1251 (windows-1251). при открытии koi8-r,iso-8859-5,cp866 и прочего "не юникода" весьма вероятен фейл. по сути всё просто: если кракозябры на экране - сравниваем/проверяем кодировку файла с кодировкой, которую "угадал" vim (точнее не угадал). просим vim открыть файл в другой кодировке. в редких случаях - меняем кодировку терминала. пример:

$ vim current_file

ыПРЧЕММУ
4 ЙАМС
тбуртпдбцб

vim

:set fileencoding
        fileencoding=cp1251
:!chardetect.py %
        current_file: KOI8-R with confidence 0.476283037726
:e ++enc=koi8-r
        !!!  PROFIT  !!!
 
Шопвеллс
4 июля
РАСПРОДАЖА

можно в ~/.vimrc всю рутину с перекодировкой оформить в виде меню. пример:

vim

"<F7> EOL format (dos <CR><NL>,unix <NL>,mac <CR>)  "  определяем/меняем формат строк файла
set  wildmenu
set  wcm=<Tab>
menu EOL.current :set fileformat<CR>
menu EOL.unix :set fileformat=unix<CR>
menu EOL.dos  :set fileformat=dos<CR>
menu EOL.mac  :set fileformat=mac<CR>
map  <F7> :emenu EOL.<Tab>

"<F6> Change termencoding  "  выставляем кодировку терминала
set  wildmenu
set  wcm=<Tab>
menu tEnc.current    :set termencoding<CR>
menu tEnc.cp1251     :set termencoding=cp1251<CR>
menu tEnc.koi8-r     :set termencoding=koi8-r<CR>
menu tEnc.iso-8859-5 :set termencoding=iso-8859-5<CR>
menu tEnc.cp866      :set termencoding=ibm866<CR>
menu tEnc.utf-8      :set termencoding=utf-8<CR>
menu tEnc.ucs-2le    :set termencoding=ucs-2le<CR>
map  <F6> :emenu tEnc.<Tab>

"<F8> Change encoding   "   здесь мы задаём рабочую (текущую) кодировку для vim
set  wildmenu
set  wcm=<Tab>
menu Enc.current    :set enc<CR>
menu Enc.cp1251     :set encoding=cp1251<CR>
menu Enc.koi8-r     :set encoding=koi8-r<CR>
menu Enc.iso-8859-5 :set encoding=iso-8859-5<CR>
menu Enc.cp866      :set encoding=cp866<CR>
menu Enc.utf-8      :set encoding=utf-8<CR>
menu Enc.ucs-2le    :set encoding=ucs-2le<CR>
map  <F8> :emenu Enc.<Tab>

"<F5> Convert file encoding    "  это меню - для изменения кодировки файлов (перед сохранением)
set  wildmenu
set  wcm=<Tab>
menu Fenc.current   :set fenc<CR>
menu Fenc.cp1251    :set fenc=cp1251<CR>
menu Fenc.koi8-r    :set fenc=koi8-r<CR>
menu Fenc.iso-8859-5 :set fenc=iso-8859-5<CR>
menu Fenc.cp866     :set fenc=ibm866<CR>
menu Fenc.utf-8     :set fenc=utf-8<CR>
menu Fenc.ucs-2le   :set fenc=ucs-2le<CR>
map  <F5> :emenu Fenc.<Tab>

" <F9> force read file with different encoding  "  а здесь мы просим vim открыть файл именно в той кодировке, которая нам нужна
set  wildmenu
set  wcm=<Tab>
menu ForceEnc.cp1251            :e ++enc=cp1251<CR>
menu ForceEnc.koi8-r            :e ++enc=koi8-r<CR>
menu ForceEnc.iso-8859-5        :e ++enc=iso-8859-5<CR>
menu ForceEnc.cp866                     :e ++enc=cp866<CR>
menu ForceEnc.utf-8                     :e ++enc=utf-8<CR>
menu ForceEnc.ucs-2le           :e ++enc=ucs-2le<CR>
map  <F9> :emenu ForceEnc.<Tab>
 
как-то так..

anonymous(*) (2016-11-05 20:17:28)

мой ласковый и нежный w3m, ня!

Подтверждено: SystemV(*) (2016-11-07 14:47:52)

[Оставить комментарий к статье]
[#] [Добавить метку] [Редактировать] Ответ на: баян: vim и multibyte encoding от anonymous 2016-11-05 20:17:28
avatar
Скрыть

Re:баян: vim и multibyte encoding

Ух, какой геморрой-то дикий...

anonymous(*)(2016-11-06 12:45:18)

Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:баян: vim и multibyte encoding от anonymous 2016-11-06 12:45:18
avatar
Скрыть

Re:баян: vim и multibyte encoding

скорее обратная сторона медали, а не гемор. плата за гибкость и функционал.

емнип сейчас используют что-то вроде "libchardet", "uchardet/libuchardet" для автоматического подбора кодировки. помогает далеко не всегда. тот же "mcedit" (редактор для миднайта), равно как и многие другие, на автоопределение забивает болт и может работать с несколькими зашитыми внутрь кодировками. с одной стороны - это вроде как правильно: для перекодировки есть специальные утилиты. а с другой стороны - лютые фейлы на "нестандартах".

собсно когда в менюшку запихиваешь опции командной строки - оно всегда выглядит страшно :)

anonymous(*)(2016-11-06 14:23:31)

мой ласковый и нежный w3m, ня!
[#] [Добавить метку] [Редактировать] Ответ на: Re:баян: vim и multibyte encoding от anonymous 2016-11-06 14:23:31
avatar
Скрыть

Re:баян: vim и multibyte encoding

Я не знаю какие проблемы могут быть сейчас, везде utf.

Много лет тому в vim были проблемы с открытием исходников писаных под виндой, приходилось подобные конфиги писать, хотя давно такого не наблюдаю.

Dr.uid(*)(2016-11-06 15:04:31)

Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) qutebrowser/0.8.2 Safari/538.1
[#] [Добавить метку] [Редактировать] Ответ на: Re:баян: vim и multibyte encoding от Dr.uid 2016-11-06 15:04:31
avatar
Скрыть

Re:баян: vim и multibyte encoding

Я не знаю какие проблемы могут быть сейчас, везде utf.

".. а дальше, Петька, начинаются нюансы.."(ц) как говаривал Чапай. два момента:
- во-первых, постоянно сталкиваюсь с "не юникодом". в основном это субтитры, оцифровки (причём не обязательно старые) и мыло. архивы e-mail-ов - просто праздник-праздник. особенно сегодня, когда 95% работает на принципе: "нажми на Красную Кнопоську" (если Зелёная Кнопоська не нажимаеццо). оно лежит себе архивами в бэкапах, и смысла переводить на utf нет. от слова вообще. utf-8 занимает по объёму кириллицы где-то в два раза больше места, чем 8-ми битная кодировка, а ucs-2le в полтора раза больше, чем utf-8. ну, ты понел, да?
- во-вторых, Слава России! только KOI8-R спасёт Эту Страну! w3m, mutt, vim и koi8-r - жгут, остальное - сасёт! если серьёзно - не всякое getty поддерживает utf. если лазаешь ssh по всяко-разному, то пользуешь что есть, а не то, что хоцца..

anonymous(*)(2016-11-06 19:31:25)

мой ласковый и нежный w3m, ня!
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!