Spec-Zone.ru › Perl 5.32

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

СМОТРИТЕ ТАКЖЕ

Encode, perlmod, perlpod

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API