enc2xs -- Perl 編碼模組產生器
enc2xs -[options]
enc2xs -M ModName mapfiles...
enc2xs -C
enc2xs 從 Unicode 字元對應檔 (.ucm) 或 Tcl 編碼檔 (.enc) 建立 Perl 擴充套件,供 Encode 使用。除了在 Encode 模組建置過程中內部使用之外,您也可以使用 enc2xs 將自己的編碼新增到 perl 中。不需要任何 XS 知識。
如果您想盡可能少了解 Perl,但需要新增新的編碼,請閱讀本章節,然後忘記其他部分。
準備好一個 .ucm 檔。您可以從某個地方取得它,也可以從頭開始撰寫自己的,或者從 Encode 套件中取得一個並自訂它。有關 UCM 格式,請參閱下一章節。在以下範例中,我將在 my.ucm 中定義我的理論編碼 myascii。$
是 shell 提示字元。
$ ls -F
my.ucm
執行以下命令;
$ 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
如果您要將 *.ucm 與模組一起安裝,請執行以下操作;
$ mkdir Encode
$ mv *.ucm Encode
$ enc2xs -M My Encode/*ucm
編輯產生的檔案。如果你沒時間而且沒有打算給其他人,你可以不用編輯。但是編輯 pod 和新增更多測試會是個好主意。
現在下達所有 Perl Mongers 都愛的指令
$ perl Makefile.PL
Writing Makefile for Encode::My
現在你只要執行 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 這種大型編碼,否則不會花太久時間。
你可以「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)
如果你對測試結果滿意,只要「make install」就可以了。
如果你想將你的編碼新增到 Encode 的需求載入清單(這樣你就不必「use Encode::YourEncoding」),請執行
enc2xs -C
來更新控制當地設定的模組 Encode::ConfigLocal。之後,只要「use Encode;」就足以依需求載入你的編碼。
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
任何出現在 #
之後的內容都會被視為註解。
標頭區段會持續到包含 CHARMAP 字眼的行。此區段的格式為 <關鍵字> 值,每行一對。用作值的字串必須加上引號。未加引號的字詞會被視為數字。\xXX 代表一個位元組。
大多數關鍵字都具有自我解釋性。subchar 表示取代字元,而非次字元。當你將 Unicode 順序解碼成此編碼,但找不到相符的字元時,會使用在此定義的位元組順序。在大部分情況下,此處的值為 \x3F;在 ASCII 中,這是一個問號。
CHARMAP 會開始字元對應表區段。每行的格式如下
<UXXXX> \xXX.. |0 # comment
^ ^ ^
| | +- Fallback flag
| +-------- Encoded byte sequence
+-------------- Unicode Character ID in hex
格式大致與標頭區段相同,但後備旗標除外:| 後面接 0..3。可能的數值意義如下
最後,CHARMAP 的結束符號會結束區段。
當您手動建立 UCM 檔案時,您應該複製 ascii.ucm 或接近您需求的現有編碼,而不是從頭開始撰寫自己的編碼。
當您這樣做時,請確定您至少保留 U0000 至 U0020,除非您的環境是 EBCDIC。
注意事項:並非所有 UCM 的功能都已實作。例如,icu:state 並未使用。因此,如果您想要支援演算法編碼,特別是 ISO-2022 系列,您需要撰寫 perl 模組。此類模組包括 Encode::JP::2022_JP、Encode::KR::2022_KR 和 Encode::TW::HZ。
當您建立對應時,您應該讓您的對應具有雙向安全性。也就是說,encode('your-encoding', decode('your-encoding', $data)) eq $data
適用於標示為 |0
的所有字元。以下是確保的方法
以 Unicode 順序對您的對應進行排序。
當您有重複的項目時,請使用 '|1' 或 '|3' 標示其中一個項目。
並確保 '|1' 或 '|3' 項目在 '|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 目錄中的另一個工具程式。
ICU 首頁 http://www.icu-project.org/
ICU:轉換資料 http://www.icu-project.org/userguide/conversion-data.html