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
-
Пропуск отображения sub-char, если нет кодовой точки.
- |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.30.3/enc2xs