内容

名称

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