⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encoder.pm

📁 source of perl for linux application,
💻 PM
字号:
## $Id: Encoder.pm,v 2.1 2006/05/03 18:24:10 dankogai Exp $#package Encode::Encoder;use strict;use warnings;our $VERSION = do { my @r = ( q$Revision: 2.1 $ =~ /\d+/g ); sprintf "%d." . "%02d" x $#r, @r };require Exporter;our @ISA       = qw(Exporter);our @EXPORT_OK = qw ( encoder );our $AUTOLOAD;sub DEBUG () { 0 }use Encode qw(encode decode find_encoding from_to);use Carp;sub new {    my ( $class, $data, $encname ) = @_;    unless ($encname) {        $encname = Encode::is_utf8($data) ? 'utf8' : '';    }    else {        my $obj = find_encoding($encname)          or croak __PACKAGE__, ": unknown encoding: $encname";        $encname = $obj->name;    }    my $self = {        data     => $data,        encoding => $encname,    };    bless $self => $class;}sub encoder { __PACKAGE__->new(@_) }sub data {    my ( $self, $data ) = @_;    if ( defined $data ) {        $self->{data} = $data;        return $data;    }    else {        return $self->{data};    }}sub encoding {    my ( $self, $encname ) = @_;    if ($encname) {        my $obj = find_encoding($encname)          or confess __PACKAGE__, ": unknown encoding: $encname";        $self->{encoding} = $obj->name;        return $self;    }    else {        return $self->{encoding};    }}sub bytes {    my ( $self, $encname ) = @_;    $encname ||= $self->{encoding};    my $obj = find_encoding($encname)      or confess __PACKAGE__, ": unknown encoding: $encname";    $self->{data} = $obj->decode( $self->{data}, 1 );    $self->{encoding} = '';    return $self;}sub DESTROY {    # defined so it won't autoload.    DEBUG and warn shift;}sub AUTOLOAD {    my $self = shift;    my $type = ref($self)      or confess "$self is not an object";    my $myname = $AUTOLOAD;    $myname =~ s/.*://;    # strip fully-qualified portion    my $obj = find_encoding($myname)      or confess __PACKAGE__, ": unknown encoding: $myname";    DEBUG and warn $self->{encoding}, " => ", $obj->name;    if ( $self->{encoding} ) {        from_to( $self->{data}, $self->{encoding}, $obj->name, 1 );    }    else {        $self->{data} = $obj->encode( $self->{data}, 1 );    }    $self->{encoding} = $obj->name;    return $self;}use overload  q("") => sub { $_[0]->{data} },  q(0+) => sub { use bytes(); bytes::length( $_[0]->{data} ) },  fallback => 1,  ;1;__END__=head1 NAMEEncode::Encoder -- Object Oriented Encoder=head1 SYNOPSIS  use Encode::Encoder;  # Encode::encode("ISO-8859-1", $data);   Encode::Encoder->new($data)->iso_8859_1; # OOP way  # shortcut  use Encode::Encoder qw(encoder);  encoder($data)->iso_8859_1;  # you can stack them!  encoder($data)->iso_8859_1->base64;  # provided base64() is defined  # you can use it as a decoder as well  encoder($base64)->bytes('base64')->latin1;  # stringified  print encoder($data)->utf8->latin1;  # prints the string in latin1  # numified  encoder("\x{abcd}\x{ef}g")->utf8 == 6; # true. bytes::length($data)=head1 ABSTRACTB<Encode::Encoder> allows you to use Encode in an object-orientedstyle.  This is not only more intuitive than a functional approach,but also handier when you want to stack encodings.  Suppose you wantyour UTF-8 string converted to Latin1 then Base64: you can simply say  my $base64 = encoder($utf8)->latin1->base64;instead of  my $latin1 = encode("latin1", $utf8);  my $base64 = encode_base64($utf8);or the lazier and more convoluted  my $base64 = encode_base64(encode("latin1", $utf8));=head1 DescriptionHere is how to use this module.=over 4=item *There are at least two instance variables stored in a hash reference,{data} and {encoding}.=item *When there is no method, it takes the method name as the name of theencoding and encodes the instance I<data> with I<encoding>.  If successful,the instance I<encoding> is set accordingly.=item *You can retrieve the result via -E<gt>data but usually you don't have to because the stringify operator ("") is overridden to do exactly that.=back=head2 Predefined MethodsThis module predefines the methods below:=over 4=item $e = Encode::Encoder-E<gt>new([$data, $encoding]);returns an encoder object.  Its data is initialized with $data ifpresent, and its encoding is set to $encoding if present.When $encoding is omitted, it defaults to utf8 if $data is already inutf8 or "" (empty string) otherwise.=item encoder()is an alias of Encode::Encoder-E<gt>new().  This one is exported on demand.=item $e-E<gt>data([$data])When $data is present, sets the instance data to $data and returns theobject itself.  Otherwise, the current instance data is returned.=item $e-E<gt>encoding([$encoding])When $encoding is present, sets the instance encoding to $encoding andreturns the object itself.  Otherwise, the current instance encoding isreturned.=item $e-E<gt>bytes([$encoding])decodes instance data from $encoding, or the instance encoding ifomitted.  If the conversion is successful, the instance encodingwill be set to "".The name I<bytes> was deliberately picked to avoid namespace tainting-- this module may be used as a base class so method names that appearin Encode::Encoding are avoided.=back=head2 Example: base64 transcoderThis module is designed to work with L<Encode::Encoding>.To make the Base64 transcoder example above really work, you couldwrite a module like this:  package Encode::Base64;  use base 'Encode::Encoding';  __PACKAGE__->Define('base64');  use MIME::Base64;  sub encode{       my ($obj, $data) = @_;       return encode_base64($data);  }  sub decode{      my ($obj, $data) = @_;       return decode_base64($data);  }  1;  __END__And your caller module would be something like this:  use Encode::Encoder;  use Encode::Base64;  # now you can really do the following  encoder($data)->iso_8859_1->base64;  encoder($base64)->bytes('base64')->latin1;=head2 Operator OverloadingThis module overloads two operators, stringify ("") and numify (0+).Stringify dumps the data inside the object.Numify returns the number of bytes in the instance data.They come in handy when you want to print or find the size of data.=head1 SEE ALSOL<Encode>,L<Encode::Encoding>=cut

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -