Spec-Zone.ru › Perl 5.36

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

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

Encode, perlmod, perlpod

© 1993–2021 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.36.0/enc2xs

Spec-Zone.ru

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