Enca – утилита, работающая в командной строке, позволяющая определить кодировку любого текстового файла. Это может быть необходимо тогда, когда в систему поступает множество текстовых файлов в самых различных кодировках. Нужно четко знать, в какой кодировке поступил конкретный файл и перекодировать его в случае необходимости в какую-то общую кодировку, например, UTF-8. Программа enca позволяет и определить, и сконвертировать (в комплекте есть утилита enconv) кодировку в случае необходимости. Однако, все это работает под Unix. В этой статье я расскажу, как скомпилировать enca под Windows.
В интернете можно найти уже скомпилированные дистрибутивы enca под windows, однако они могут быть не самой последней версии, и кроме того, что самое главное, могут содержать в себе вредоносный код и вирусы. Поэтому лучше и правильнее компилировать все самим.
Для компиляции надо скачать исходные коды программы с сайта разработчиков. На момент написания статьи последняя версия была с номером 1.13. Исходный код поставляется в архиве, поэтому его надо распаковать в удобное место, например, E:\enca\enca-1.13.
Теперь нужен компилятор. Можно воспользоваться тем, что идет в составе MinGW. Он легко скачивается и устанавливается. После установки необходимо запустить MSYS. Обычно это файл D:\MinGW\msys\1.0\msys.bat, его и необходимо выполнить.
Когда откроется консоль, нужно будет перейти в директорию исходных кодов enca командой
cd E:/enca/enca-1.13
Далее запустить команды конфигурирования и компиляции:
./configure make make install
Скомпилированную программу нужно искать в папке D:\MinGW\msys\1.0\local\bin.
Все было бы хорошо, но запустить программу сходу не удастся, так как она не подготовлена под среду Windows. Чтобы подготовить ее, нужно провести в исходном коде незначительные изменения.
Начнем с файла E:\enca\enca-1.13\src\filebuf.c
В самом начале программа выбирает метод получения случайных чисел:
/* Good random seed source, prefer urandom, this is not a crypto app. */ #if !(defined RANDOM_FILE) && (defined HAVE__DEV_URANDOM) # define RANDOM_FILE "secret.txt" #endif /* HAVE__DEV_URANDOM */ #if !(defined RANDOM_FILE) && (defined HAVE__DEV_ARANDOM) # define RANDOM_FILE "/dev/arandom" #endif /* HAVE__DEV_ARANDOM */ #if !(defined RANDOM_FILE) && (defined HAVE__DEV_RANDOM) # define RANDOM_FILE "/dev/random" #endif /* HAVE__DEV_RANDOM */ #if !(defined RANDOM_FILE) && (defined HAVE__DEV_SRANDOM) # define RANDOM_FILE "/dev/srandom" #endif /* HAVE__DEV_SRANDOM */
Удалим переменную RANDOM_FILE, чтобы программа не просила несуществующий файл:
/* reset random file in windows */ #undef RANDOM_FILE
Сделав это, программа начнет генерировать случайные числа на основе метки времени. Это плохо тем, что при совпадении меток времени будет использован один и тот же временный файл. При желании можно усовершенствовать.
Далее в функции file_temporary необходимо прописать путь к директории временных файлов Windows:
/* 'template' for temporary file creation */ static const char *TMP_PREFIX = "C:\\WINDOWS\\Temp\\" PACKAGE_TARNAME;
Здесь же, в этой функции, программа создает временный файл, который используется для конвертации. Когда она его создает, сразу же отправляется команда на его удаление. Это допустимо в системах POSIX, однако Windows такого механизма не понимает. Он пытается удалить файл, когда тот еще используется. Естественно, это вызывает ошибку. Поэтому в этом месте нужно закомментировать удаление, и удалить файл тогда, когда преобразование будет завершено:
/* here, we have a unique temporary file opened readwrite */ if (ulink) //file_unlink(file->name);
Преобразование завершается в файле E:\enca\enca-1.13\src\convert_iconv.c в функции convert_iconv. Ее концовку необходимо изменить следующим образом:
const char *tmp_name; tmp_name = _strdup(tempfile->name); file_free(tempfile); file_unlink(tmp_name); enca_free(tmp_name); do_iconv_close(icd); return err;
То есть создается временная переменная с именем временного файла, затем после закрытия файла эта переменная используется для удаления этого файла.
После всех этих манипуляций с кодом программу enca можно компилировать, запускать и пользоваться ей в среде Windows.
Пример использования:
enca -L ru -x UTF-8 < %_in% > %_out%
Здесь осуществляется преобразование кодировки текстового файла на русском языке. На входе - файл в неизвестной кодировке, на выходе - в UTF-8. По умолчанию enca перезаписывает файл в новой кодировке. Если необходимо сохранить старый файл и записать в новый, нужно использовать перенаправление вывода, как в примере.