1 (изменено: went.out, 2009-08-12 23:18:18)

Тема: HTA: пакетная перекодировка файлов (Recode v1.0)

Тут на днях пришлось написать небольшую утилитку,
конвертирующую файлы из одной кодировки в другую.

Изначально нужно было для web-разработки (CMS'ка тут одна мимо проходила)...
Потом пригодилось и для тестирования новых функций одного клавиатурного тренажера...

Первоначально было просто JS скриптом, в коде задавался "файл из" и "файл в",
выполнялся, само собой, WScript'ом.

Для личного удобства прикрутил простейший самопальный GUI.

Исходный код открыт для модификации, юзайте на здоровье, никаких лицензий и ограничений
(ну, на всякий случай опубликован на сайте проекта под GPL v3)...

Т.к. никакого описания не предполагалось -- делал для себя,
ну и для тех, "кто в танке" расскажу, пожалуй, немного -- об устройстве:

При загрузке производится чтение текущей директории (диск "C:", т.к. есть у всех, наверное )
Диск можно изменить в левом верхнем углу, поле "Disk".
Переход по директориям нажатием на директорию (там курсорчик меняется со стрелочки на руку).
Для того, чтобы изменить маску (по умолчанию "txt") измените в соответствующем текстовом поле
"Mask" вверху, рядом с "Disc".

Маска сравнивается с концом имени файла, так что это работает именно как расширение.
Не проверял, но, по идее можно, например, выбрать файлы, заканчивающиеся,
на нечто вроде "something.htm".
К сожалению стандартную всем понятную "*" не "прикручивал", нужно будет --
отключите фильтр по маске, покажет все файлы, или допишите код
(насколько я понимаю достаточно будет одного IF'a).

Для того, чтобы произвести перекодирование нужно нажать кнопку "Recode".
Перед этим, конечно же, желательно "создать пакет".
Для "создания пакета" просто щелкните рядом с директорией или файлом, там есть
такой квадрат с горизонтальной черточкой. Вот на него и щелкайте, черточка
сменится на букву V, соответственно данная директория или файл "как бы"
добавятся в пакет.

Опять же, к сожалению, перейти внутрь одной директории, добавить нечто, а потом
перейти внутрь другой и тоже нечто добавить -- нельзя.
Зато работает рекурсивное перекодирование во вложеных директориях
(флажок " Include sub folders ! ", по умолчанию взведён).

После нажатия "Recode" будет сформирован "пакет", он выведется в то же поле,
которое до этого отображало список директорий и файлов.
Это такой "контроль, всё ли правильно".
Вместе с этим в центре вверху появятся еще две кнопки:
"Recode?" -- красная такая.
И "No" -- обычная.
Первая начнёт перекодировку, вторая, соответственно, всё отменит.
Настоятельно рекомендую перед нажатием "красной кнопки": пробежитесь взглядом
по сформированному пакету глазами, вдруг чего не так...

Внимание!!!: за один раз производится перекодировка только из одного формата в другой.
Утилита не умеет определять кодировку самостоятельно!!!
Так что шансы "все поломать" очень и очень немаленькие...
Если у Вас в директориях (особенно во вложеных) файлы разных кодировок -- не поленитесь,
рассортируйте, а потом пользуйтесь утилитой...

Собственно, кодировки...
Это поля "From" и "To".

"From" это: UTF-8, Win 1251 и KOI-8r
"To" это то же самое, но еще есть UTF-8 без подписи BOM (Byte Order Mark).
Для UTF-8 отметка BOM это три байта в начале файла.
Вот их то и не будет.
Для чего это нужно -- ну, некоторые web-системы иногда "некузяво" работают с файлами,
в которых есть отметка BOM. Правда без этой отметки файлы плохо распознаются
текстовыми редакторами (кодировка определяется неверно, и вместо символов -- кракозяблы).
К сожалению для убирания этой отметки перекодирование происходит как бы в 2 стадии,
сначала в текстовом режиме файл конвертируется в UTF с отметкой, потом в бинарном
вырезаются первые 2 байта. Это, конечно, тормозно... но я делал быстро, а не качественно,
так что -- прошу меня извинить, идея реализована, работоспособна, остальное -- дело техники.

Наконец, если Вам нужны еще кодировки, то, не поленитесь, откройте исходник на 60-й
строке, и прочтите путь в реестре, где их можно посмотреть.
Имена разделов реестра (как бы папочек), это и есть имена кодировок.
Можно использовать и алиасы, они находятся внутри разделов, называются AliasForCharset.

Используется следующим образом:
там на 70 и на 76 строке есть, соответственно, два тэга <SELECT>'ов.
Достаточно просто добавить в еще один <OPTION> с нужным "VALUE=".
"VALUE" это как раз то, что вы подсмотрите в реестре...
Это ВСЁ...
Никаких дополнительных модификаций для использования нужной Вам кодировки "нэ трэбо".

Остается только добавить, что там (в реестре) уже есть "почти все известные науке кодировки",
так что мне лень было их выписывать, мне нужно было просто решить локальную задачку...


Работает через ADO, так что нужен MDAC, но он обычно идет в самой Windows.
Работает быстро и стабильно: тестировал на своём ноуте (AMD Turion 64x2 Mobile, 2Gb, 5400 об./мин.),
файлик размером в 65Mb ("с копейками") конвертится в UTF без BOM (т.е. 2 перезаписи)
меньше чем за 10 секунд (у меня XP Pro, если что...).
Работа с мелкими файлами во вложенных директориях тоже достаточно шустра
и нареканий у меня не вызвала.


Внимание! На утилиту ругается касперский... матом...
На предмет ошибок не тестировал, по идее там не в чем ошибаться, но всё же...

За сим кратким вступлением разрешите откланяться, искренне ваш went ...


Сайт утилиты:
http://code.google.com/p/kbtrainer/
там в правой стороне есть раздел "Featured downloads:", вот там оно и лежит...
Так что лицензия GPL v3 совершенно распространяется и на этот продукт.

В общем если Вам нужно в Proprietal Use -- просто поменяйте код сохранив функционал
На самом деле это сайт клавиатурного тренажера,
о нем уже есть тема: http://forum.script-coding.com/viewtopic.php?id=2451

Post's attachments

Recode_v.1.0.zip 3.56 kb, 416 downloads since 2009-08-12 

You don't have the permssions to download the attachments of this post.