суббота, 24 октября 2009 г.

Подключаем ICONV в nautilus или быстро меняем кодировку файла.




Очень часто, я сталкиваюсь с проблемой перекодировки файлов. К примеру, в субтитрах. Очень часто русские субтитры содержат информацию в кодировке windows-1251, а мой любимый VLC player просто отказывается выводить их нормально. Раньше проблему я решал через gedit, потом начал пользоваться консольной iconv, конечно, наверняка, существует ещё много решений, но я решил написать небольшой wrapper к iconv, чтобы облегчить себе жизнь окончательно.

Начну с того, что есть замечательная папка в Gnome - ~/.gnome2/nautilus-scripts, и какой бы скрипт вы туда не положили, он тут же будет отображаться в меню File->Scripts или по нажатию правой клавиши мышки. Скрипт нужно класть именно туда.

Сама задача, которую я поставил - это сделать так, чтобы выделив нужные мне файлы в nautilus, я бы быстро смог поменять кодировку всем
выбранным файлам.

Код с описание дальше.



Итак сам код:

#!/bin/bash
#
#  ICONV wrapper
#
# AUTHOR:  nol1ght (nol1ght.mail@gmail.com)
# VERSION: 1.0
# LICENSE: public
#

#Создаём массив с кодировками, все поддерживаемые кодировки iconv'ом можно посмотреть набрав iconv -l в консоли.
encodings=( "WINDOWS-1251" "KOI8-RU" "ISO-8859-5" "UTF-8"  )
#Высчитываем последний элемент
max_index=$((${#encodings[@]} - 1))

#подготавливаем текст для меню, из которого будет выбираться кодировка
for ((i = 0; i <= max_index; i++)); do   gdialog_array="$gdialog_array $i ${encodings[i]} " done 
#Запрашиваем у пользователя текущую кодировку файлов 
FROM=$(gdialog --title "Select encoding of original text" --menu "Encoding FROM" 20 51 4 $gdialog_array 2>&1)
#Если приходит пустое значение, значит пользователь ничего не выбрал или закрыл диалог -> завершаем скрипт
if [ -z $FROM ]
then
exit
fi
#Запрашиваем у пользователя нужную кодировку файлов
TO=$(gdialog --title "Select encoding for output" --menu "Encoding TO" 20 51 4 $gdialog_array 2>&1)
#Если приходит пустое значение, значит пользователь ничего не выбрал или закрыл диалог -> завершаем скрипт
if [ -z $TO]
then
exit
fi

#создаём временный файл.
TMP_FILE=`tempfile 2> /dev/null`
#перебираем все выделенные файлы в nautilus
while [ $# -gt 0 ]
do
#Обрабатываем пробелы в имени файла.
file=`echo "$1" | sed 's/ /\?/g'`
#Перекодируем во временный файл
iconv -f ${encodings[$FROM]} -t ${encodings[$TO]} $file -o $TMP_FILE
#Заменяем текущий файл временным.
cp $TMP_FILE $file
shift
done

Как она работает можно увидеть на скриншотах:
1. У нас есть файл в неправильной кодировке(это видно в preview):


2. Нажимаем правую клавишу, заходим в скрипты и выбираем iconv:

3. Выбираем из какой в какую кодировку нам нужно перекодировать:

4. Результат можно увидеть сразу же в preview.
 

Надеюсь данный скрипт будет кому-то полезен, если заинтересовались, как ещё можно увеличить функциональность вашего nautilus скриптами, тогда обратите внимание на http://g-scripts.sourceforge.net/ - тут множество различных скриптов на все случаи жизни )

source:
iconv

Комментариев нет:

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