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