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() 无法覆盖编码的规范名称。在尝试潜在别名之前,首先会按规范名称查找编码。