Encode::Alias - 編碼別名的定義
use Encode;
use Encode::Alias;
define_alias( "newName" => ENCODING);
define_alias( qr/.../ => ENCODING);
define_alias( sub { return ENCODING if ...; } );
允許 newName 用作 ENCODING 的別名。ENCODING 可以是編碼名稱或編碼物件(如 Encode 中所述)。
目前 define_alias() 的第一個參數可以用以下方式指定
define_alias( qr/^iso8859-(\d+)$/i => '"iso-8859-$1"' );
在這種情況下,如果 ENCODING 不是參考,則會對其進行 eval
,以允許替換 $1
等。這個範例是一種將 X11 字型中使用的名稱別名為 iso-8859-* 系列 MIME 名稱的方式。請注意單引號內的雙引號。
(或者,你不必自己執行此操作,因為此範例已預先定義)
如果你在此處使用正規表示式,你必須使用所示的引號,否則它將無法運作。另請注意,即使對於有經驗的人來說,正規表示式處理也很棘手。請謹慎使用此功能。
define_alias( sub {shift =~ /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } );
以上範例的相同效果,但方式不同。coderef 將別名作為引數,並在成功時傳回正規名稱,或在失敗時傳回 undef。請注意,如果提供第二個引數,則會忽略它。請比正規表示式版本更謹慎地使用它。
從 Encode 1.87 開始,舊形式
define_alias( sub { return /^iso8859-(\d+)$/i ? "iso-8859-$1" : undef } );
不再運作。
Encode 1.86 以前在內部使用「local $_」來實作此舊形式。但考慮以下程式碼;
use Encode;
$_ = "eeeee" ;
while (/(e)/g) {
my $utf = decode('aliased-encoding-name', $1);
print "position:",pos,"\n";
}
在 Encode 1.86 之前,這會因為「local $_」而失敗。
你可以透過套用 define_alias() 來覆寫預定義別名。新別名總是會先評估,必要時,define_alias() 會清除內部快取,以讓新定義可用。
# redirect SHIFT_JIS to MS/IBM Code Page 932, which is a
# superset of SHIFT_JIS
define_alias( qr/shift.*jis$/i => '"cp932"' );
define_alias( qr/sjis$/i => '"cp932"' );
如果你想要清除所有預定義別名,你可以使用
Encode::Alias->undef_aliases;
來執行此操作。而
Encode::Alias->init_aliases;
會取得原廠設定。
請注意,define_alias() 無法覆寫編碼的正規名稱。編碼會先透過正規名稱查詢,才會嘗試可能的別名。