內容

名稱

enc2xs -- Perl 編碼模組產生器

語法

enc2xs -[options]
enc2xs -M ModName mapfiles...
enc2xs -C

描述

enc2xs 從 Unicode 字元對應檔 (.ucm) 或 Tcl 編碼檔 (.enc) 建立 Perl 擴充套件,供 Encode 使用。除了在 Encode 模組建置過程中內部使用之外,您也可以使用 enc2xs 將自己的編碼新增到 perl 中。不需要任何 XS 知識。

快速指南

如果您想盡可能少了解 Perl,但需要新增新的編碼,請閱讀本章節,然後忘記其他部分。

0.

準備好一個 .ucm 檔。您可以從某個地方取得它,也可以從頭開始撰寫自己的,或者從 Encode 套件中取得一個並自訂它。有關 UCM 格式,請參閱下一章節。在以下範例中,我將在 my.ucm 中定義我的理論編碼 myascii。$ 是 shell 提示字元。

$ 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 Mongers 都愛的指令

$ 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;」就足以依需求載入你的編碼。

Unicode 字元對應表

Encode 使用 Unicode 字元對應表 (UCM) 格式來對應來源字元。此格式由 IBM 的 ICU 套件使用,並由 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

當您手動建立 UCM 檔案時,您應該複製 ascii.ucm 或接近您需求的現有編碼,而不是從頭開始撰寫自己的編碼。

當您這樣做時,請確定您至少保留 U0000U0020,除非您的環境是 EBCDIC。

注意事項:並非所有 UCM 的功能都已實作。例如,icu:state 並未使用。因此,如果您想要支援演算法編碼,特別是 ISO-2022 系列,您需要撰寫 perl 模組。此類模組包括 Encode::JP::2022_JPEncode::KR::2022_KREncode::TW::HZ

處理重複對應

當您建立對應時,您應該讓您的對應具有雙向安全性。也就是說,encode('your-encoding', decode('your-encoding', $data)) eq $data 適用於標示為 |0 的所有字元。以下是確保的方法

以下是 big5-eten 的範例。

<U2550> \xF9\xF9 |0
<U2550> \xA2\xA4 |3

內部編碼 -> Unicode 和 Unicode -> 編碼對應如下所示;

 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 目錄中的另一個工具程式。

書籤

另請參閱

Encodeperlmodperlpod