Перекодировка текстовых файлов из CP1251 в UTF-8

Ну вот, в очередной раз у меня возникла необходимость немножко изменить старый проект, который был изначально написан под Вендой в IAR-е.

Чтобы перенести его на новую платформу, нужно сначала перекодировать текстовые файлы. Изменить кодировку с CP1251 на UTF-8.

Для этого дела в Ubuntu имеется утилита iconv, которой нужно указать три параметра:

  • кодировку «из»,
  • кодировку «в»,
  • имя выходного

а так же задать имя входного файла.

$ iconv -f CP1251 -t UTF-8 -o <outfile> <infile>

В принципе можно «сэкономить» на указании кодировки «в», то есть вообще не вводить этот параметр. Тогда кодировкой «в» будет считаться кодировка текущей локали. А она как раз и есть UTF-8.

$ iconv -f CP1251 -o <outfile> <infile>

Можно даже не указывать входную кодировку «из». Утилита сама попытается определить ее.

$ iconv -o <outfile> <infile>

Но я как-то не очень пока доверяю этому, поэтому указываю сам.

Если еще опустить и имя выходного файла, то утилита выдаст перекодированный текст на консоль:

$ iconv <infile>

Иногда такое бывает нужно. Ну, например, для проверки правильности работы. Можно отослать вывод в команду less, тогда полученный текст можно прокручивать вверх и вниз:

$ iconv <infile> | less

Ну вот, собственно и все, что касается самой перекодировки.

Но что делать, когда файлов много? Набирать команду для перекодировки каждого файла ручками — не Unix-way! Давайте напишем скрипт, который переберет все файлы в текущем директории и перекодирует.

Скрипт:

#!/bin/bash
FILES="*.[ch]"
for i in $FILES
do
  echo "Конвертирую файл $i..."
  mv $i $i.icv
  iconv -f CP1251 -t UTF-8 $i.icv > $i
  rm -f $i.icv
done

Сохраним его в файле с именем win2lin в поддиректории bin домашнего директория. Он нам еще не раз пригодится.

1 responses to “Перекодировка текстовых файлов из CP1251 в UTF-8

  1. Пояснение к примеру: попробовал его на практике, работает, спасибо! Для тех, кто еще не изучил регулярные выражения, скрипт переберет не все файлы, а только исходники Си *.c, *.h.
    Для моего случая оказалось, что ivconv встречал недопустимый символ в исходнике, переводя только первую русскую строчку «#define IMAGE_EMPTY -2 // iconv: недопустимая входная последовательность в позиции 285»
    Для решения в исходнике надо добавить -c ключ в iconv -с -f CP1251 -t UTF-8 $i.icv > $i

Оставьте комментарий