|
|
Перекодировщик xcodeД.В.Хмелёв
Содержание1 Зачем нужен ещё один перекодировщик?2 Установка и компиляция 3 Особенности использования 4 Применения 4.1 Сортировка 4.2 Внутренний перекодировщик 4.3 Фильтр на входной почте 5 О перестановочной кодировке и iconv 6 Лог изменений программы 7 Награды программы 8 Лицензия Ё-ware 9 Дополнительные вопросы
1 Зачем нужен ещё один перекодировщик?В природе существует очень много программ, которые перекодируют между разными кодировками кириллического алфавита. Эти функции встроены в специализированные HTML-редакторы, в драйверы клавиатуры и т.п. Тем не менее, анализ существующего положения дел показывает, что все эти способы страдают хотя бы одним из перечисленных ниже изъянов:
Перекодировщик xcode является платформо-независимой программой, которая лишена всех этих недостатков.
Кроме этого
Разумеется, xcode не отменяет имеющиеся перекодировщики в редакторах. Он просто является мощным и полезным добавлением для пакетной обработки данных.
2 Установка и компиляцияТекущая версия программы: xcode 4.1.Исходный текст ./src/xcodesrc.zip Программа доступна под следующие операционные системы: DOS ./bin/xcodedos.zip Рекомендуется скопировать программу в одну из директорий, находящихся в переменной окружения PATH. Win ./bin/xcodewin.zip Рекомендуется скопировать программу в %WINDOWS%\COMMAND (что часто совпадает с C:\WINDOWS\COMMAND). Эта версия отличается от версии для DOS и скомпилирована как консольное приложение win32. Unix ./bin/linux.zip Должна работать под всеми современными дистрибутивами Линукса (программа была откомпилирована под SuSE 8.1) ./bin/xcoderedhat71.zip для RedHat 7.1 (больше не поддерживается, компилируйте исходник) ./bin/xcodesun.zip для Sun Solaris 8 (больше не поддерживается, компилируйте исходник). При компиляции программы xcode.c определите параметр D_KOI (D_ALT или D_WIN), определяющий вывод на экран в кодировке koi8-r (cp866 или cp1251, соответственно). Например так: gcc xcode.c -DD_KOI -O3 -o xcodeНо можно расскоментировать соответствующий #define прямо в тексте программы (эти определения находятся на первой странице листинга). Теперь скопируйте выполнимый xcode (xcode.exe в DOS/Win32) в одну из директорий, перечисленных в системной переменной PATH. Под Win95/98 хорошим местом будет директория %WINDOWS%COMMAND (которая обычно маскируется под C:\WINDOWS\COMMAND). Под Юниксом станадартная директория для таких программ: /usr/local/bin/ (если доступны права рута) или просто домашняя директория (если права рута недоступны). Программа xcode является Ё-ware, см лицензию в разделе 8.
3 Особенности использованияДля использования программы вам требуется перейти в режим командной строки, имеющийся в любом файловом менеджере под DOS/Win, и в любой консоли под Unix. Справка по программе выводится при набореxcode -hЕсли требуется перекодировать файл text.txt, из кодировки cp866 в кодировку cp1251, запустите xcode -w text.txt text.txtПосле запуска команды вы получите сообщения вроде Угадана входная кодировка cp866 Выходная кодировка cp1251Теперь перекодируем текст в кодировку koi8: xcode -k text.txt text.txt Угадана входная кодировка cp1251 Выходная кодировка koi8-rи, наконец, обратно в cp866: xcode -a text.txt text.txt Угадана входная кодировка koi8-r Выходная кодировка cp866 Обратите внимание, что ни разу не потребовалось указать кодировку файла, подлежащего преобразованию. Кроме того обратимость перекодировки xcode обеспечивает, что получившийся файл text.txt идентичен самому себе до преобразования, даже если text.txt содержал символы из верхней части таблицы, не принадлежавшие алфавиту. Обратите внимание, что аналогичный фокус не пройдёт, например, с распространённой программой recode, поскольку она не обеспечивает обратимости перекодировки. Приведённый выше пример с явным указанием кодировки выглядит так: xcode +a -w text.txt text.txt В качестве входной установлена кодировка cp866 Выходная кодировка cp1251 xcode +w -k text.txt text.txt В качестве входной установлена кодировка cp1251 Выходная кодировка koi8-r xcode +k -a text.txt text.txt В качестве входной установлена кодировка koi8-r Выходная кодировка cp866Таким образом переключатель + означает выбор кодировки у исходного текста. Аналогичный сеанс с recode выглядел бы так:
recode -aw text.txt text.txt recode -wk text.txt text.txt recode -ka text.txt text.txtПри этом неалфавитные символы из верхней части таблицы ASCII (см. раздел Кодировки) скорее всего безвозвратно перемешаются с символами алфавита. Если же кодировка исходного файла text.txt была отлична от cp866, то текст в файле text.txt скорее всего потеряется в результате такой перекодировки безвозвратно. Таким образом, главное преимущество xcode перед остальными программами: надёжность в сохранении данных. Самое худшее, что может случиться - это неверная перестановка букв, которую при желании всегда можно обратить.
4 Применения4.1 СортировкаПрограмму xcode.c можно применять для корректной сортировки данных по алфавиту. Для этого надо перекодировать текст в кодировку sorted (см. статью Кодировки).Типичный пример сортировки под Юниксом, сортирующий строки файла text.txt и выводящий результат в файл sorted
xcode -8 <text.txt | LANG= LC_COLLATE= sort\ | xcode +8 >sorted.txt Заметим, что мы здесь «обнулили» локаль с помощью команд LANG= LC_COLLATE=. Такой подход позволяет сортировать тексты даже на нелокализованных системах (в частности, под DOS, где понятие локали отсутствует вообще). Пример команд, сортирующих строки файла под ДОС:
xcode -8 text.txt text.txt sort text.txt >sorted.txt xcode +8 sorted.txt sorted.txt
4.2 Внутренний перекодировщикВ семействе редакторов VIM, GVIM и т.п., наследующих легендарному VI, xcode.c можно применять для автоматической перекодировки текста прямо внутри редактора. Только возможно, придётся запускать xcode -s -p в silent-режиме, поскольку некоторые варианты VI «подхватывают» вывод информационных сообщений программы в поток ошибок stderr, что может быть неуместно.
4.3 Фильтр на входной почтеНе знаю как у вас, а когда я читаю почту на сервере с помощью программы PINE, тексты, приходящие в win1251 не перекодируются. Так я поставил xcode.c входным фильтром в .procmailrc и вот мой рецепт::0: |/u/dkhmelev/bin/xcode >>$ORGMAIL
5 О перестановочной кодировке и iconvВопрос Я не очень понял суть перестановочной перекодировки. Протестировав xcode на нескольких файлах я заметил, что файлы перекодированные xcode и iconv ничем не отличаются (файлы сравнивались при помощи kompare) если в тексте нет псевдографики. На псевдографике iconv сбивается, а xcode оставляет в этих местах крякозябры. Как я понял, перестановочная перекодировка заменяет только русские буквы, а все остальные коды оставляет как есть. Правильно? Это единственное отличие от других перекодировщиков? Наоборот. Все подстановочные перекодировщики заменяют только русские буквы, а перестановочная кодировка заменяет все буквы. Попробую объяснить на следующем примере. Пусть вместо 128 кодов в верхней половине кодовой таблицы имеется всего 5 кодов, а буквы занимают на 66 кодов, а 3. И пусть будет две кодировки этих трёх букв:
То есть, в первой кодировке код А - 1, а во второй код А - 2 и т.д. Обычный перекодировщик из первой кодировки во вторую коду 1 сопоставляет код 2, коду 2 коду 4, коду 3, код 5. Коды 4 и 5 остаются на месте. Итого
Очевидно, буквы с кодами 2 и 4 отображаются в один код - 4. Таким образом, если на входе был бинарный файл (содержащий не только символы алфавита, а например, ещё и псевдографику), то он будет испорчен безнадёжно: псевдографика обратится в буквы. Это может привести к принципиальной невозможности восстановить исходный текст. Перестановочный кодировщик перекодирует коды 4 и 5 в оставшиеся пустыми коды в образе:
Очевидно, это преобразование обратимо. И даже если мы неверно поняли кодировку исходного файла, всё равно есть шанс её восстановить. Всё что мы теряем в худшем случае - это информацию о перестановке букв, которую восстановить значительно легче, чем текст со слившимися буквами, что частая ситуация, особенно, когда файл в KOI-кодировке перекодируется по ошибке из кодировки WIN в ту же кодировку KOI. В заключение отмечу, что проблема с iconv заключается в том, что он пытается установить взаимно-однозначное сопоставление кодировок, которое, к сожалению, не имеет места (скажем, в win-1251 нет псевдографики, хотя в KOI-8 и ALT псевдографика присутствует). Поэтому iconv спотыкается и говорит, что преобразование невозможно.
6 Лог изменений программы
Revision 4.1 2004/02/04 05:32:13 mamont Добавлен переключатель -c, позволяющий определять кодировку файла и выдавать её на экран. Полная справка по -H содержит инструкции по применению этой новой возможности. При корректном использовании переключателя -c программа выходит с кодом ошибки 6 --- ERROR_INFORM_ENCODING. Revision 4.0 2003/12/20 23:11:12 mamont Добавлен ключ -d для определения двойной перекодировки. Смена номера версии на 4.0 Revision 3.7 2003/10/05 18:35:21 mamont Исправлен глюк, возникавший при вызове xcode in out с отсутствующим файлом out (выдавалась ошибка). Revision 3.6 2003/10/05 00:15:24 mamont Заработал прозрачно бинарный стандартный ввод/вывод под ДОС-окном. Версию mingw не проверял, но, по идее тоже должна работать. Revision 3.5 2003/10/04 23:26:25 mamont Теперь stdout устанавливается в бинарный режим в DOS/WIN окружении. Иначе добавлялся код \x0D в конце каждой строки (\x0D\x0A). Revision 3.4 2003/10/04 23:02:54 mamont Исправлена ошибка в выдаче диагностики в предыдущей версии. Добавлены дополнительные коды выхода (см. xcode -H, раздел КОДЫ ВЫХОДА) Добавлен переключатель --, по которому прерывается разбор командной строки. Добавлено сообщение об ошибке в аргументах лпрограммы, ежели такая просходит. Revision 3.3 2003/09/27 18:37:05 mamont переформатировал комментарии Revision 3.2 2003/09/27 18:35:43 mamont Совсем забыл: теперь программа выходит с ненулевым кодом при какой-либо ошибке. Сами ошибки можно посмотреть в тексте: E_OK и т.д. Revision 3.1 2003/09/27 18:28:26 mamont Теперь опции вида /h допустимы только при выходной кодировке D_ALT По опции "--" сканирование аргументов останавливается. Следующие аргументы рассматриваются как имена файлов. Revision 3.0 2003/04/03 20:00:35 mamont Смена версии на 3.0 команда: ci -f3.0 xcode.c Revision 2.10 2003/04/03 19:47:12 mamont Поправлена ошибка в кодировке "mac", на которую любезно указал Сергей Скотников (неверный код буквы «я»). Используемая библиотека перестановочной перекодировки с http://www.rusf.ru/books/yo/encoding.html получила название SRECODE.C и явно выделена в тексте программы комментариями. Revision 2.9 2003/03/31 15:46:49 mamont Текст приведён к стандарту C99 (по модулю предупреждений о конвертации между знаковыми/беззнаковыми буквами). Бороться с этим можно явным заданием преобразования указателей, но не нужно в силу усложнения кода. Revision 2.8 2003/03/26 02:17:16 mamont Поправлено предупреждение "suspicious pointer conversion" Revision 2.7 2003/03/26 02:14:13 mamont Добавлено декодирование html-Уникоденных текстов (вроде Дима) Revision 2.6 2003/03/10 17:36:26 mamont Информация о режиме silent добавленая в справку Revision 2.5 2003/03/10 17:30:05 mamont Добавлен режим silent по опции -s Revision 2.4 2003/03/09 01:42:47 mamont Исправлено неправильное поведение при одном имени файла Revision 2.3 2003/03/08 19:57:28 mamont Теперь программа компилируется bc 3.1 без предупреждений и ошибок. Revision 2.2 2003/03/08 19:33:27 mamont Режим трубы теперь по умолчанию только в Досе/Виндах. (Дос/Win определяется по переключателю D_ALT) Revision 2.1 2003/03/08 19:25:05 mamont *** empty log message *** Revision 2.0 2003/03/08 19:23:31 mamont Смена номера версии на 2.0 Revision 1.14 2003/03/08 19:13:24 mamont Значительные улучшения по сравнению с предыдущей версией. Теперь имеется опция с трубой -p, а под Досовской консолью по умолчанию программа выводит краткую помощь. Если входная кодировка уже указана, то программа не определяет её автоматически, а сразу производит перекодировку. Единственный тонкий момент: когда надо перекодировать файл на месте. В этом случае используется временный файл на диске, как и всегда. Revision 1.13 2003/03/08 16:24:13 mamont Добавил Revision Revision 1.12 2003/03/08 16:17:35 mamont Начат лог изменений
7 Награды программы
8 Лицензия Ё-wareПрограмма xcode является Ё-ware. Именно, её можно свободно распространять, модифицировать, и даже дизассемблировать как в двоичном виде, так и в исходном тексте. Однако, используя эту программу, вы должны использовать букву Ё во всех текстах, которые набираете на компьютерах: начиная с электронных писем и заканчивая крупной прозаической формой.
9 Дополнительные вопросыПо всем вопросам и пожеланиям, связанным с программой, обращайтесь по моему адресу, указанному в конце страницы. Желательно в поле Subject указать слово xcode.
Содержание1 Зачем нужен ещё один перекодировщик?2 Установка и компиляция 3 Особенности использования 4 Применения 4.1 Сортировка 4.2 Внутренний перекодировщик 4.3 Фильтр на входной почте 5 О перестановочной кодировке и iconv 6 Лог изменений программы 7 Награды программы 8 Лицензия Ё-ware 9 Дополнительные вопросы
Примечания:1т.е. символы из расширения ASCII, не совпадающие с алфавитными, могут утеряться. Например, перекодированный исполнимый файл, скорее всего, теряется при использовании обычных перекодировщиков безвозвратно. |
|
©2002-2004 Редактор Дмитрий Хмелёв |