enc2xs
СОДЕРЖАНИЕ
НАЗВАНИЕ
enc2xs — Генератор модулей кодирования Perl
СИНТАКСИС
enc2xs -[options]
enc2xs -M ModName mapfiles...
enc2xs -C ОПИСАНИЕ
enc2xs создаёт Perl-расширение для использования модулем Encode из файлов отображения символов Юникода (.ucm) или файлов кодирования Tcl (.enc). Помимо внутреннего использования во время сборки модуля Encode, вы можете использовать enc2xs для добавления собственных кодировок в Perl. Знания XS не требуются.
Быстрый гид
Если вы хотите знать как можно меньше о Perl, но вам нужно добавить новую кодировку, просто прочитайте эту главу и забудьте о остальном.
- 0.
-
Подготовьте файл .ucm. Вы можете взять его откуда-то, создать свой с нуля или скопировать из дистрибутива Encode и настроить его. Для формата UCM см. следующую главу. В примере ниже я буду называть теоретическую кодировку myascii, определённую в my.ucm.
$— это приглашение командной строки.$ ls -F my.ucm - 1.
-
Выполните следующую команду;
$ enc2xs -M My my.ucm generating Makefile.PL generating My.pm generating README generating ChangesТеперь посмотрите на текущую директорию. Она должна выглядеть так.
$ ls -F Makefile.PL My.pm my.ucm t/Были созданы следующие файлы.
Makefile.PL - MakeMaker script My.pm - Encode submodule t/My.t - test file- 1.1.
-
Если вы хотите установить файлы *.ucm вместе с модулями, сделайте следующее;
$ mkdir Encode $ mv *.ucm Encode $ enc2xs -M My Encode/*ucm
- 2.
-
Отредактируйте сгенерированные файлы. Вы можете этого не делать, если у вас нет времени И вы не собираетесь отдавать его кому-то другому. Но неплохо было бы отредактировать POD и добавить больше тестов.
- 3.
-
Теперь выполните команду, которую любят все Perl-разработчики:
$ perl Makefile.PL Writing Makefile for Encode::My - 4.
-
Теперь всё, что вам нужно сделать, это выполнить make.
$ make cp My.pm blib/lib/Encode/My.pm /usr/local/bin/perl /usr/local/bin/enc2xs -Q -O \ -o encode_t.c -f encode_t.fnm Reading myascii (myascii) Writing compiled form 128 bytes in string tables 384 bytes (75%) saved spotting duplicates 1 bytes (0.775%) saved using substrings .... chmod 644 blib/arch/auto/Encode/My/My.bs $Время выполнения зависит от скорости вашего компьютера и размера вашей кодировки. Если вы не работаете с чем-то большим, вроде euc-tw, это не займёт слишком много времени.
- 5.
-
Вы можете сразу выполнить "make install", но сначала стоит протестировать.
$ make test PERL_DL_NONLAZY=1 /usr/local/bin/perl -Iblib/arch -Iblib/lib \ -e 'use Test::Harness qw(&runtests $verbose); \ $verbose=0; runtests @ARGV;' t/*.t t/My....ok All tests successful. Files=1, Tests=2, 0 wallclock secs ( 0.09 cusr + 0.01 csys = 0.09 CPU) - 6.
-
Если результат теста вас устраивает, просто выполните "make install".
- 7.
-
Если вы хотите добавить свою кодировку в список модулей Encode для динамической загрузки (чтобы не нужно было писать "use Encode::YourEncoding"), выполните
enc2xs -Cдля обновления модуля Encode::ConfigLocal, который управляет локальными настройками. После этого «use Encode;» будет достаточно для загрузки ваших кодировок по требованию.
Таблица символов Юникода
Encode использует формат Таблицы символов Юникода (UCM) для отображения исходных символов. Этот формат используется пакетом ICU от IBM и был принят Ником Ингом-Симмонсом для использования с модулем Encode. Так как UCM более гибкий, чем карта кодирования Tcl, и гораздо более удобен в использовании, теперь это рекомендуемый формат для Encode.
Файл UCM выглядит так.
#
# Comments
#
<code_set_name> "US-ascii" # Required
<code_set_alias> "ascii" # Optional
<mb_cur_min> 1 # Required; usually 1
<mb_cur_max> 1 # Max. # of bytes/char
<subchar> \x3F # Substitution char
#
CHARMAP
<U0000> \x00 |0 # <control>
<U0001> \x01 |0 # <control>
<U0002> \x02 |0 # <control>
....
<U007C> \x7C |0 # VERTICAL LINE
<U007D> \x7D |0 # RIGHT CURLY BRACKET
<U007E> \x7E |0 # TILDE
<U007F> \x7F |0 # <control>
END CHARMAP -
Всё, что следует за
#считается комментарием. -
Раздел заголовка продолжается до строки, содержащей слово CHARMAP. Этот раздел имеет вид <ключевое слово> значение, одна пара на строке. Строки, используемые в качестве значений, должны быть заключены в кавычки. Необработанные слова интерпретируются как числа. \xXX представляет байт.
Большинство ключевых слов самоочевидны. subchar означает символ подстановки, а не подсимвол. При декодировании последовательности Юникода в эту кодировку, но соответствующий символ не найден, будет использован определённый здесь байтовый последовательность. В большинстве случаев значение здесь — \x3F; в ASCII это знак вопроса.
-
CHARMAP начинает раздел таблицы символов. Каждая строка имеет следующий вид:
<UXXXX> \xXX.. |0 # comment ^ ^ ^ | | +- Fallback flag | +-------- Encoded byte sequence +-------------- Unicode Character ID in hexФормат в целом такой же, как и в разделе заголовка, за исключением флага обратного отображения: |, после которого следуют 0..3. Значение возможных значений таковы:
- |0
-
Безопасный для обратного преобразования. Символ, декодированный в Юникод, кодируется обратно в ту же последовательность байтов. У большинства символов есть этот флаг.
- |1
-
Обратный переход для Юникод -> кодировка. При обнаружении enc2xs добавляет этот символ только для карты кодирования.
- |2
-
Пропустить отображение подсимволов, если нет кодового значения.
- |3
-
Обратный переход для кодировка -> Юникод. При обнаружении enc2xs добавляет этот символ только для карты декодирования.
-
И, наконец, END OF CHARMAP завершает раздел.
При ручном создании файла UCM следует скопировать ascii.ucm или существующую кодировку, которая близка к вашей, а не создавать свою с нуля.
При этом убедитесь, что вы оставили значения по умолчанию от U0000 до U0020, если только ваша среда не EBCDIC.
ПРЕДУПРЕЖДЕНИЕ: не все функции UCM реализованы. Например, icu:state не используется. Из-за этого вам нужно написать модуль Perl, если вы хотите поддерживать алгоритмические кодировки, особенно серию ISO-2022. Такие модули включают Encode::JP::2022_JP, Encode::KR::2022_KR и Encode::TW::HZ.
Управление дублирующимися отображениями
При создании карты вы ДОЛЖНЫ сделать свои отображения безопасными для обратного преобразования. То есть, encode('your-encoding', decode('your-encoding', $data)) eq $data обозначает все символы, отмеченные как |0. Вот как это сделать:
-
Отсортируйте свою карту в порядке Юникода.
-
При наличии дублирующейся записи отметьте одну из них '|1' или '|3'.
-
И убедитесь, что запись '|1' или '|3' следует за записью '|0'.
Вот пример из big5-eten.
<U2550> \xF9\xF9 |0
<U2550> \xA2\xA4 |3 Внутренняя карта кодировка -> Юникод и Юникод -> кодировка выглядит так;
E to U U to E
--------------------------------------
\xF9\xF9 => U2550 U2550 => \xF9\xF9
\xA2\xA4 => U2550
Таким образом, она безопасна для обратного преобразования \xF9\xF9. Но если строка выше перевёрнута, вот что произойдёт.
E to U U to E
--------------------------------------
\xA2\xA4 => U2550 U2550 => \xF9\xF9
(\xF9\xF9 => U2550 is now overwritten!) Пакет Encode поставляется с утилитой ucmlint, грубой, но достаточной для проверки целостности файла UCM. Найдите её в директории Encode/bin.
Если есть сомнения, вы можете использовать ucmsort, ещё одну утилиту из каталога Encode/bin.
Закладки
-
Главная страница ICU http://www.icu-project.org/
-
Таблицы отображения символов ICU http://site.icu-project.org/charts/charset
-
ICU:Данные преобразования http://www.icu-project.org/userguide/conversion-data.html
СМОТРИТЕ ТАКЖЕ
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.28.3/enc2xs