Возникла банальная задача поменять кодировку файла с Windows CP-1251 на UTF-8 посредством консоли. Но заменить кодировку нужно было не в одном файле а сразу в огромном количестве мелких файлов. Как правило такая задача возникает при работе с двумя системами windows и linux. При разработке сайтов часто бывает что старые сайты при переносе всё ещё находятся в win кодировке 1251, а в современном мире лучше уже везде использовать более удобную UTF-8. Объяснение этому простое, windows предпочитает работать с текстовыми файлами в кодировке CP-1251, а linux в свою очередь использует кодировку UTF-8. Способов смены кодировки файла оказалось множество, опишу тот, который понравился мне. Можно конечно открыть каждый файлик текстовым редактором и сохранить в нужной кодировке, но если файлов очень много, то это займет огромное количество времени. Поэтому воспользуемся консолью.
Данную процедуру можно провести прям на сервере в консоле. Существует такая утилита как enconv, она входит в состав пакета enca, который в свою очередь упрощает работу с кодировками файлов.
Если этого пакета нет, то его нужно будет установить на сервер. Команда для этой цели в Centos, будет примерно такая:
yum install enca
Итак, для начала неплохо бы узнать, в какой кодировке файл:
#
|
file -i file.txt |
Или так
#
|
enca file.txt |
Узнав исходную кодировку файла, меняем её с помощью команды:
#
|
iconv -f cp1251 -t utf8 исходный.txt -o конечный.txt |
Есть способ, при котором программа сама определит кодировку файла, и преобразует её к кодировке текущей локали:
#
|
enconv file.txt |
Преобразовать файл, в кодировку отличную от текущей локали, можно добавив параметр -x:
#
|
enconv -x CP1251 file.txt |
Это всё хорошо, но нам же нужно заменить кодировку сразу в большом количестве файлов, поэтому сделаем примерно такой запрос в консоле:
for fname in *; do enconv "$fname"; done
Данный набор команд переберет все файлы в текущей директории и заменит им кодировку на текущую UTF-8. Можно сделать более выборочную сортировку если это требуется.
for fname in *.php; do enconv "$fname"; done
Тут мы меняем кодировку только в php файлах.
Думаю это может пригодится веб разработчикам, которым часто приходиться работать с консолью linux и большим количеством разных файлов..