SharePoint Alfresco PHP MySQL
О сайте Контакты
вторник, 12 июня 2012 г.

Компиляция Enca под Windows

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 перезаписывает файл в новой кодировке. Если необходимо сохранить старый файл и записать в новый, нужно использовать перенаправление вывода, как в примере.

Sergey Lysenko, вторник, 12 июня 2012 г.

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