Skip to content

Instantly share code, notes, and snippets.

@while0pass
Created May 6, 2010 20:56
Show Gist options
  • Save while0pass/392696 to your computer and use it in GitHub Desktop.
Save while0pass/392696 to your computer and use it in GitHub Desktop.
Перкодировка большого числа файлов из cp1251 в UTF-8
====================================================
Полное условие задачи:
* Смена кодировки текстового файла с cp1251 на UTF-8
* Последняя строка обязательно должна завершаться символом конца строки
* В качестве символа конца строки должны выступать CR + LF, как в DOS
Решение с помощью редактора Vim:
# В редакторе меняем текущую директорию, на каталог с файлами, которые надо
# перекодировать.
:cd /path/to/dir/with/files/
# Используя wildcards описываем класс файлов из нашего каталога, которые нам
# надо открыть, и добавляем этот класс в список аргументов Vim. Практически это
# значит, что все файлы будут считаны в отдельные буферы Vim, а для первого из
# них ещё будет открыто окно Vim для возможности его редактирования.
:args *.txt
# Далее, выполняем набор следующих комманд.
:argdo e ++nobin ++enc=cp1251 | set eol fenc=utf-8 ft=dos | update
# ``:argdo`` выполняет стоящую далее через пробел строку с командами для всех
# прежде открытых нами аргументов Vim.
#
# ``e ++nobin ++enc=cp1251`` открывает заново каждый аргумент в текстовом
# недвоичном режиме (``++nobin`` в общем-то ненужная перестраховка) с
# использованием кодировки cp1251. После этого идет разделитель комманд "|".
# Перед ним обязательно в данном случае должен быть пробел, иначе команда
# ``e[dit]`` получит неправильное имя кодировки "cp1251|", а дальнейшие слова
# set, eol и т.п. будет воспринимать как обозначения имен файлов. В итоге, она
# вместо того, чтобы повторно открыть файл, связанный с текущим буфером, будет
# пытаться открыть файл set и ещё может выдать ошибку, что может открывать
# только один файл, а не несколько.
#
# ``set eol`` или ``set endofline`` гарантирует, что в файле при записи
# последняя строка обязательно будет кончаться символ конца строки.
# Противополжная команда здесь -- ``set noeol``.
#
# ``set fenc=utf-8`` или ``set fileencoding=utf-8`` гарантирует, что при записи
# файла будет использована кодировка UTF-8.
#
# ``set ft=dos`` или ``set filetype=dos`` определяет, что при записи в качестве
# символов конца строки будет использована последовательность \r\n = CR + LF =
# 0x0D + 0x0A = chr(13) + chr(10).
#
# Все три опции объединены через пробел после одной команды ``set``. Команда
# ``update`` гарантирует, что файл будет сохранен только если в нем есть
# изменения.
Global replacement in a bunch of files in Vim:
:args *.[ch]
:argdo %s/\<my_foo\>/My_Foo/ge | update
This changes the word "my_foo" to "My_Foo" in all *.c and *.h files. The "e"
flag is used for the ":substitute" command to avoid an error for files where
"my_foo" isn't used. ":update" writes the file only if changes were made.
*list-repeat*
:bufdo[!] {cmd}
:windo {cmd}
:tabd[o] {cmd}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment