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.
-
Отредактируйте сгенерированные файлы. Вам не нужно, если у вас нет времени И нет желания делиться им с кем-то. Но неплохо отредактировать под и добавить больше тестов.
- 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 и был адаптирован Nick Ing-Simmons для использования с модулем 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Формат примерно такой же, как в разделе заголовка, за исключением флага fallback: |, за которым следуют 0..3. Значение возможных значений таковы:
- |0
-
Безопасный для обратного преобразования. Символ, декодированный в Юникод, закодируется обратно в ту же последовательность байтов. Большинство символов имеют этот флаг.
- |1
-
Обратная замена для unicode -> кодировка. При обнаружении enc2xs добавляет этот символ только для карты кодирования.
- |2
-
Пропустить отображение подзамещающего символа, если нет кодовой точки.
- |3
-
Обратная замена для кодировка -> unicode. При обнаружении 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–2023 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.38.0/enc2xs