enc2xs
СОДЕРЖАНИЕ
НАЗВАНИЕ
enc2xs — Генератор модулей Perl Encode
СИНТАКСИС
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.
-
Отредактируйте сгенерированные файлы. Вам не нужно, если у вас нет времени И нет намерений передать его кому-то другому. Но хорошая идея — отредактировать под и добавить больше тестов.
- 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.34.0/enc2xs