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–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