Переходя на Linux, Вы будете часто сталкиваться с вопросами кодировки текстовой информации. Например, текстовый файл созданный в Windows, будет совершенно не читаем при его открытии в Linux. Почему?
Дело в том, что система Windows, по умолчанию, сохраняет текстовые файлы в кодировке Windows-1251, а Linux — в кодировке KOI-8. В результате, текст выглядит не читаемым.
О том как решить проблему преобразования текста из одной кодировки в другую, далее.
И так, для решения проблемы с кодировкой, существует конечно-же множество способов, но мы рассмотрим только один из них:
— допустим, есть файл win1251.txt, в котором содержится текст, набранный в кодировке Windows-1251. Требуется перевести содержимое этого файла в кодировку koi8-r.
Для решения этой задачи, воспользуемся программой iconv, которая входит в базовый состав ОС Linux.
iconv — конвертирует текст из одной кодировки в другую. Исходная кодировка задаётся ключом -f, а выходная — ключом -t. Посмотреть полный список всех кодировок можно командой:
iconv -l
Общий формат этой команды таков:
iconv [-c] [-s] [-f encoding] [-t encoding] [inputfile ...]
1) Откройте окно терминала (Меню > Приложения > Стандартные > Терминал).
2) Перейдите в папку с текстовым файлом, который вам необходимо перевести в другую кодировку (команды ls и cd <имя_папки>).
3) Находясь в папке с файлом, выполните:
iconv -s -f WINDOWS-1251 -t UTF-8 "win1251.txt" > "koi8r.txt"
Рассмотрим пример подробнее:
1) Ключ -s используется для того, чтобы указать программе iconv не выводить ошибки, если таковые возникнут в работе;
2) Ключом -f мы указываем исходную кодировку файла WINDOWS-1251;
3) Ключом -t мы указываем новую кодировку файла UTF-8;
4) Далее, в кавычках, мы указываем имя исходного файла win1251.txt
5) Затем мы ставим знак > указывающий в какой файл нам сохранить результат перекодировки koi8r.txt
И в завершении, несколько полезных приемов использования программы iconv:
1. Находим все файлы в текущей директории с расширением *.html, перекодируем их в UTF-8 и результаты копирует в папку res
mkdir res find -maxdepth 1 -iname "*.html" -type f -exec bash -c "cat {} | iconv -c -f WINDOWS-1251 -t UTF-8> ./res/{}" \;
2. А что если требуется перекодировать все файлы «*.htm» рекурсивно? Тогда нам поможет следующий скрипт:
find . -name '*.htm' | while read i; do iconv -f WINDOWS-1251 -t UTF-8 "$i" >tmp; mv tmp "$i"; done
или с помощью bash скрипта так (рекурсивно перекодируем все файлы «*.htm»):
#!/bin/sh for i in `find . -name '*.htm' -type f` do echo $i iconv -f WINDOWS-1251 -t UTF-8 "$i" > tmp mv -f tmp "$i" done