內容

名稱

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() 的第一個參數可以用以下方式指定

作為簡單字串。
作為 qr// 編譯的正規表示式,例如
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() 無法覆寫編碼的正規名稱。編碼會先透過正規名稱查詢,才會嘗試可能的別名。

另請參閱

EncodeEncode::Supported