Ё

Русская фантастика >> Книжная полка >> Ё >> История | Кодировки | Поддержка | xcode | Этюды | Мнения | Конфузы | ЧаВО | Пресса

 

Перекодировщик xcode

Перекодировщик xcode

Д.В.Хмелёв

Содержание

1  Зачем нужен ещё один перекодировщик?
2  Установка и компиляция
3  Особенности использования
4  Применения
    4.1  Сортировка
    4.2  Внутренний перекодировщик
    4.3  Фильтр на входной почте
5  О перестановочной кодировке и iconv
6  Лог изменений программы
7  Награды программы
8  Лицензия Ё-ware
9  Дополнительные вопросы

1  Зачем нужен ещё один перекодировщик?

В природе существует очень много программ, которые перекодируют между разными кодировками кириллического алфавита. Эти функции встроены в специализированные HTML-редакторы, в драйверы клавиатуры и т.п. Тем не менее, анализ существующего положения дел показывает, что все эти способы страдают хотя бы одним из перечисленных ниже изъянов:

  1. Необратимость перекодировки1.
  2. Неаккуратность с буквой Ё.
  3. Необходимость явного выбора кодировки.
  4. Небольшой набор кодировок.
  5. Работа только под какой-либо определённой платформой (Win32, DOS, и т.п.)
  6. Сложности с применением в пакетном режиме (как, например, перекодировать все файлы в поддиректории в заданную кодировку, независимо от исходной?)
  7. Объём перекодируемого файла ограничен оперативной памятью.
  8. Отсутствие режима командной строки.

Перекодировщик xcode является платформо-независимой программой, которая лишена всех этих недостатков.

  1. Перекодировка обратима.
  2. Полная поддержка буквы Ё.
  3. Кодировка входного файла определяется автоматически.
  4. Поддерживается 14 кодировок, включая стандартные cp866, cp1251, koi8-r, iso8859-5, mac.
  5. Код программы написан с использованием ANSI Си и переносим, в принципе, на любую платформу (поддерживаются Win32, DOS, Unix, GNU/Linux).
  6. Программа может перекодировать файл на месте, поэтому её можно просто применять ко всем файлам в директории (такая функция заложена в любом современном менеджере файлов: Far, WinCommander и т.д.)
  7. Объём перекодируемого файла ограничен только свободным местом на жёстком диске.
  8. Интерфейс командной строки.

Кроме этого

  • можно декодировать quoted-printable,
  • можно декодировать HTML-Unicode текст вроде «Дима»,
  • можно использовать режим трубы,
  • имеется специальная сортировочная кодировка, позволяющая корректно сортировать файлы с буквой Ё стандартными средствами операционной системы (нелокализованными!),
  • интерфейс на русском/английском языках,
  • устойчивость текста программы к корректной перекодировке,
  • текст программы хранится в одном файле, что обеспечивает его целостность при перемещении между компьютерами.

Разумеется, 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
код12345
букваАБВ**

Кодировка 2
код12345
буква*А*БВ

То есть, в первой кодировке код А - 1, а во второй код А - 2 и т.д.

Обычный перекодировщик из первой кодировки во вторую коду 1 сопоставляет код 2, коду 2 коду 4, коду 3, код 5. Коды 4 и 5 остаются на месте. Итого


1 ® 2


2 ® 4


3 ® 5


4 ® 4


5 ® 5

Очевидно, буквы с кодами 2 и 4 отображаются в один код - 4. Таким образом, если на входе был бинарный файл (содержащий не только символы алфавита, а например, ещё и псевдографику), то он будет испорчен безнадёжно: псевдографика обратится в буквы.

Это может привести к принципиальной невозможности восстановить исходный текст.

Перестановочный кодировщик перекодирует коды 4 и 5 в оставшиеся пустыми коды в образе:


1 ® 2

2 ® 4

3 ® 5

4 ® 1
(*)

5 ® 3
(*)

Очевидно, это преобразование обратимо. И даже если мы неверно поняли кодировку исходного файла, всё равно есть шанс её восстановить. Всё что мы теряем в худшем случае - это информацию о перестановке букв, которую восстановить значительно легче, чем текст со слившимися буквами, что частая ситуация, особенно, когда файл в 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-Уникоденных текстов
(вроде &#1044;&#1080;&#1084;&#1072;)

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  Награды программы

COOL! COOL! от ListSoft http://www.listsoft.ru/program.php?id=8777

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

Русская фантастика >> Книжная полка >> Ё >> История | Кодировки | Поддержка | xcode | Этюды | Мнения | Конфузы | ЧаВО | Пресса


©2002-2004 Редактор Дмитрий Хмелёв
©2002-2004 Русская фантастика, гл.ред Дмитрий Ватолин
©2002 Рисунок Владимир Савватеев