Comment tweak from Philip.
[p5sagit/p5-mst-13.2.git] / ext / Encode / Encode.pm
CommitLineData
2c674647 1package Encode;
51ef4e11 2use strict;
6d1c0808 3our $VERSION = do { my @r = (q$Revision: 1.52 $ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r };
5129552c 4our $DEBUG = 0;
6d1c0808 5use XSLoader ();
6XSLoader::load 'Encode';
2c674647 7
2c674647 8require Exporter;
6d1c0808 9our @ISA = qw(Exporter);
2c674647 10
4411f3b6 11# Public, encouraged API is exported by default
85982a32 12
13our @EXPORT = qw(
14 decode decode_utf8 encode encode_utf8
15 encodings find_encoding
4411f3b6 16);
17
85982a32 18our @FB_FLAGS = qw(DIE_ON_ERR WARN_ON_ERR RETURN_ON_ERR LEAVE_SRC PERLQQ);
19our @FB_CONSTS = qw(FB_DEFAULT FB_QUIET FB_WARN FB_PERLQQ FB_CROAK);
20
51ef4e11 21our @EXPORT_OK =
6d1c0808 22 (
85982a32 23 qw(
24 _utf8_off _utf8_on define_encoding from_to is_16bit is_8bit
25 is_utf8 perlio_ok resolve_alias utf8_downgrade utf8_upgrade
26 ),
27 @FB_FLAGS, @FB_CONSTS,
28 );
29
6d1c0808 30our %EXPORT_TAGS =
85982a32 31 (
32 all => [ @EXPORT, @EXPORT_OK ],
33 fallbacks => [ @FB_CONSTS ],
34 fallback_all => [ @FB_CONSTS, @FB_FLAGS ],
35 );
36
4411f3b6 37# Documentation moved after __END__ for speed - NI-S
2c674647 38
bf230f3d 39use Carp;
40
a63c962f 41our $ON_EBCDIC = (ord("A") == 193);
f2a2953c 42
5d030b67 43use Encode::Alias;
44
5129552c 45# Make a %Encoding package variable to allow a certain amount of cheating
46our %Encoding;
aae85ceb 47our %ExtModule;
48require Encode::Config;
49eval { require Encode::ConfigLocal };
5129552c 50
656753f8 51sub encodings
52{
5129552c 53 my $class = shift;
071db25d 54 my @modules = (@_ and $_[0] eq ":all") ? values %ExtModule : @_;
c731e18e 55 for my $mod (@modules){
56 $mod =~ s,::,/,g or $mod = "Encode/$mod";
6d1c0808 57 $mod .= '.pm';
c731e18e 58 $DEBUG and warn "about to require $mod;";
59 eval { require $mod; };
5129552c 60 }
c731e18e 61 my %modules = map {$_ => 1} @modules;
5129552c 62 return
ce912cd4 63 sort { lc $a cmp lc $b }
64 grep {!/^(?:Internal|Unicode)$/o} keys %Encoding;
51ef4e11 65}
66
85982a32 67sub perlio_ok{
68 exists $INC{"PerlIO/encoding.pm"} or return 0;
69 my $stash = ref($_[0]);
70 $stash ||= ref(find_encoding($_[0]));
71 return ($stash eq "Encode::XS" || $stash eq "Encode::Unicode");
72}
73
51ef4e11 74sub define_encoding
75{
18586f54 76 my $obj = shift;
77 my $name = shift;
5129552c 78 $Encoding{$name} = $obj;
18586f54 79 my $lc = lc($name);
80 define_alias($lc => $obj) unless $lc eq $name;
81 while (@_)
82 {
83 my $alias = shift;
84 define_alias($alias,$obj);
85 }
86 return $obj;
656753f8 87}
88
656753f8 89sub getEncoding
90{
dd9703c9 91 my ($class,$name,$skip_external) = @_;
18586f54 92 my $enc;
93 if (ref($name) && $name->can('new_sequence'))
94 {
95 return $name;
96 }
97 my $lc = lc $name;
5129552c 98 if (exists $Encoding{$name})
18586f54 99 {
5129552c 100 return $Encoding{$name};
18586f54 101 }
5129552c 102 if (exists $Encoding{$lc})
18586f54 103 {
5129552c 104 return $Encoding{$lc};
18586f54 105 }
c50d192e 106
5129552c 107 my $oc = $class->find_alias($name);
c50d192e 108 return $oc if defined $oc;
109
5129552c 110 $oc = $class->find_alias($lc) if $lc ne $name;
c50d192e 111 return $oc if defined $oc;
112
c731e18e 113 unless ($skip_external)
d1ed7747 114 {
c731e18e 115 if (my $mod = $ExtModule{$name} || $ExtModule{$lc}){
116 $mod =~ s,::,/,g ; $mod .= '.pm';
117 eval{ require $mod; };
118 return $Encoding{$name} if exists $Encoding{$name};
119 }
d1ed7747 120 }
18586f54 121 return;
656753f8 122}
123
4411f3b6 124sub find_encoding
125{
dd9703c9 126 my ($name,$skip_external) = @_;
127 return __PACKAGE__->getEncoding($name,$skip_external);
4411f3b6 128}
129
fcb875d4 130sub resolve_alias {
131 my $obj = find_encoding(shift);
132 defined $obj and return $obj->name;
133 return;
134}
135
b2704119 136sub encode($$;$)
4411f3b6 137{
18586f54 138 my ($name,$string,$check) = @_;
b2704119 139 $check ||=0;
18586f54 140 my $enc = find_encoding($name);
141 croak("Unknown encoding '$name'") unless defined $enc;
142 my $octets = $enc->encode($string,$check);
143 return undef if ($check && length($string));
144 return $octets;
4411f3b6 145}
146
b2704119 147sub decode($$;$)
4411f3b6 148{
18586f54 149 my ($name,$octets,$check) = @_;
b2704119 150 $check ||=0;
18586f54 151 my $enc = find_encoding($name);
152 croak("Unknown encoding '$name'") unless defined $enc;
153 my $string = $enc->decode($octets,$check);
154 $_[1] = $octets if $check;
155 return $string;
4411f3b6 156}
157
b2704119 158sub from_to($$$;$)
4411f3b6 159{
18586f54 160 my ($string,$from,$to,$check) = @_;
b2704119 161 $check ||=0;
18586f54 162 my $f = find_encoding($from);
163 croak("Unknown encoding '$from'") unless defined $f;
164 my $t = find_encoding($to);
165 croak("Unknown encoding '$to'") unless defined $t;
166 my $uni = $f->decode($string,$check);
167 return undef if ($check && length($string));
a999c27c 168 $string = $t->encode($uni,$check);
18586f54 169 return undef if ($check && length($uni));
3ef515df 170 return defined($_[0] = $string) ? length($string) : undef ;
4411f3b6 171}
172
b2704119 173sub encode_utf8($)
4411f3b6 174{
18586f54 175 my ($str) = @_;
c731e18e 176 utf8::encode($str);
18586f54 177 return $str;
4411f3b6 178}
179
b2704119 180sub decode_utf8($)
4411f3b6 181{
18586f54 182 my ($str) = @_;
183 return undef unless utf8::decode($str);
184 return $str;
5ad8ef52 185}
186
f2a2953c 187predefine_encodings();
188
189#
190# This is to restore %Encoding if really needed;
191#
192sub predefine_encodings{
6d1c0808 193 if ($ON_EBCDIC) {
f2a2953c 194 # was in Encode::UTF_EBCDIC
195 package Encode::UTF_EBCDIC;
196 *name = sub{ shift->{'Name'} };
197 *new_sequence = sub{ return $_[0] };
198 *decode = sub{
199 my ($obj,$str,$chk) = @_;
200 my $res = '';
201 for (my $i = 0; $i < length($str); $i++) {
6d1c0808 202 $res .=
f2a2953c 203 chr(utf8::unicode_to_native(ord(substr($str,$i,1))));
204 }
205 $_[1] = '' if $chk;
206 return $res;
207 };
208 *encode = sub{
209 my ($obj,$str,$chk) = @_;
210 my $res = '';
211 for (my $i = 0; $i < length($str); $i++) {
6d1c0808 212 $res .=
f2a2953c 213 chr(utf8::native_to_unicode(ord(substr($str,$i,1))));
214 }
215 $_[1] = '' if $chk;
216 return $res;
217 };
6d1c0808 218 $Encode::Encoding{Unicode} =
c731e18e 219 bless {Name => "UTF_EBCDIC"} => "Encode::UTF_EBCDIC";
6d1c0808 220 } else {
f2a2953c 221 # was in Encode::UTF_EBCDIC
222 package Encode::Internal;
223 *name = sub{ shift->{'Name'} };
224 *new_sequence = sub{ return $_[0] };
225 *decode = sub{
226 my ($obj,$str,$chk) = @_;
227 utf8::upgrade($str);
228 $_[1] = '' if $chk;
229 return $str;
230 };
231 *encode = \&decode;
6d1c0808 232 $Encode::Encoding{Unicode} =
c731e18e 233 bless {Name => "Internal"} => "Encode::Internal";
f2a2953c 234 }
235
236 {
237 # was in Encode::utf8
238 package Encode::utf8;
239 *name = sub{ shift->{'Name'} };
240 *new_sequence = sub{ return $_[0] };
241 *decode = sub{
242 my ($obj,$octets,$chk) = @_;
243 my $str = Encode::decode_utf8($octets);
244 if (defined $str) {
245 $_[1] = '' if $chk;
246 return $str;
247 }
248 return undef;
249 };
250 *encode = sub {
251 my ($obj,$string,$chk) = @_;
252 my $octets = Encode::encode_utf8($string);
253 $_[1] = '' if $chk;
254 return $octets;
255 };
c00aecee 256 $Encode::Encoding{utf8} =
c731e18e 257 bless {Name => "utf8"} => "Encode::utf8";
f2a2953c 258 }
f2a2953c 259}
260
18586f54 261require Encode::Encoding;
c00aecee 262@Encode::XS::ISA = qw(Encode::Encoding);
b2704119 263
c00aecee 264# This is very dodgy - PerlIO::encoding does "use Encode" and _BEFORE_ it gets a
265# chance to set its VERSION we potentially delete it from %INC so it will be re-loaded
266# NI-S
267eval {
b0b300a3 268 require PerlIO::encoding;
269 unless (PerlIO::encoding->VERSION >= 0.02){
270 delete $INC{"PerlIO/encoding.pm"};
271 }
272};
85982a32 273# warn $@ if $@;
6d1c0808 274@Encode::XS::ISA = qw(Encode::Encoding);
4411f3b6 275
656753f8 2761;
277
2a936312 278__END__
279
4411f3b6 280=head1 NAME
281
282Encode - character encodings
283
284=head1 SYNOPSIS
285
286 use Encode;
287
67d7b5ef 288
289=head2 Table of Contents
290
6d1c0808 291Encode consists of a collection of modules which details are too big
67d7b5ef 292to fit in one document. This POD itself explains the top-level APIs
6d1c0808 293and general topics at a glance. For other topics and more details,
67d7b5ef 294see the PODs below;
295
296 Name Description
297 --------------------------------------------------------
6d1c0808 298 Encode::Alias Alias definitions to encodings
67d7b5ef 299 Encode::Encoding Encode Implementation Base Class
300 Encode::Supported List of Supported Encodings
301 Encode::CN Simplified Chinese Encodings
302 Encode::JP Japanese Encodings
303 Encode::KR Korean Encodings
304 Encode::TW Traditional Chinese Encodings
305 --------------------------------------------------------
306
4411f3b6 307=head1 DESCRIPTION
308
47bfe92f 309The C<Encode> module provides the interfaces between Perl's strings
67d7b5ef 310and the rest of the system. Perl strings are sequences of
311B<characters>.
312
313The repertoire of characters that Perl can represent is at least that
314defined by the Unicode Consortium. On most platforms the ordinal
315values of the characters (as returned by C<ord(ch)>) is the "Unicode
316codepoint" for the character (the exceptions are those platforms where
317the legacy encoding is some variant of EBCDIC rather than a super-set
318of ASCII - see L<perlebcdic>).
319
320Traditionally computer data has been moved around in 8-bit chunks
321often called "bytes". These chunks are also known as "octets" in
322networking standards. Perl is widely used to manipulate data of many
323types - not only strings of characters representing human or computer
324languages but also "binary" data being the machines representation of
325numbers, pixels in an image - or just about anything.
326
327When Perl is processing "binary data" the programmer wants Perl to
328process "sequences of bytes". This is not a problem for Perl - as a
329byte has 256 possible values it easily fits in Perl's much larger
330"logical character".
331
332=head2 TERMINOLOGY
4411f3b6 333
67d7b5ef 334=over 4
21938dfa 335
67d7b5ef 336=item *
337
338I<character>: a character in the range 0..(2**32-1) (or more).
339(What Perl's strings are made of.)
340
341=item *
342
343I<byte>: a character in the range 0..255
344(A special case of a Perl character.)
345
346=item *
347
348I<octet>: 8 bits of data, with ordinal values 0..255
349(Term for bytes passed to or from a non-Perl context, e.g. disk file.)
350
351=back
4411f3b6 352
67d7b5ef 353The marker [INTERNAL] marks Internal Implementation Details, in
354general meant only for those who think they know what they are doing,
355and such details may change in future releases.
356
357=head1 PERL ENCODING API
4411f3b6 358
359=over 4
360
f2a2953c 361=item $octets = encode(ENCODING, $string[, CHECK])
4411f3b6 362
47bfe92f 363Encodes string from Perl's internal form into I<ENCODING> and returns
67d7b5ef 364a sequence of octets. ENCODING can be either a canonical name or
365alias. For encoding names and aliases, see L</"Defining Aliases">.
366For CHECK see L</"Handling Malformed Data">.
4411f3b6 367
67d7b5ef 368For example to convert (internally UTF-8 encoded) Unicode string to
6d1c0808 369iso-8859-1 (also known as Latin1),
681a7c68 370
67d7b5ef 371 $octets = encode("iso-8859-1", $unicode);
681a7c68 372
f2a2953c 373=item $string = decode(ENCODING, $octets[, CHECK])
4411f3b6 374
47bfe92f 375Decode sequence of octets assumed to be in I<ENCODING> into Perl's
67d7b5ef 376internal form and returns the resulting string. as in encode(),
377ENCODING can be either a canonical name or alias. For encoding names
378and aliases, see L</"Defining Aliases">. For CHECK see
47bfe92f 379L</"Handling Malformed Data">.
380
1b2c56c8 381For example to convert ISO-8859-1 data to UTF-8:
681a7c68 382
67d7b5ef 383 $utf8 = decode("iso-8859-1", $latin1);
681a7c68 384
f2a2953c 385=item [$length =] from_to($string, FROM_ENCODING, TO_ENCODING [,CHECK])
47bfe92f 386
85982a32 387Convert B<in-place> the data between two encodings.
1b2c56c8 388For example to convert ISO-8859-1 data to UTF-8:
2b106fbe 389
390 from_to($data, "iso-8859-1", "utf-8");
391
392and to convert it back:
393
394 from_to($data, "utf-8", "iso-8859-1");
4411f3b6 395
ab97ca19 396Note that because the conversion happens in place, the data to be
397converted cannot be a string constant, it must be a scalar variable.
398
3ef515df 399from_to() return the length of the converted string on success, undef
400otherwise.
401
4411f3b6 402=back
403
f2a2953c 404=head2 UTF-8 / utf8
405
406The Unicode consortium defines the UTF-8 standard as a way of encoding
407the entire Unicode repertoire as sequences of octets. This encoding is
408expected to become very widespread. Perl can use this form internally
409to represent strings, so conversions to and from this form are
410particularly efficient (as octets in memory do not have to change,
411just the meta-data that tells Perl how to treat them).
412
413=over 4
414
415=item $octets = encode_utf8($string);
416
417The characters that comprise string are encoded in Perl's superset of UTF-8
418and the resulting octets returned as a sequence of bytes. All possible
419characters have a UTF-8 representation so this function cannot fail.
420
421=item $string = decode_utf8($octets [, CHECK]);
422
423The sequence of octets represented by $octets is decoded from UTF-8
424into a sequence of logical characters. Not all sequences of octets
425form valid UTF-8 encodings, so it is possible for this call to fail.
426For CHECK see L</"Handling Malformed Data">.
427
428=back
429
51ef4e11 430=head2 Listing available encodings
431
5129552c 432 use Encode;
433 @list = Encode->encodings();
434
435Returns a list of the canonical names of the available encodings that
436are loaded. To get a list of all available encodings including the
437ones that are not loaded yet, say
438
439 @all_encodings = Encode->encodings(":all");
440
441Or you can give the name of specific module.
442
c731e18e 443 @with_jp = Encode->encodings("Encode::JP");
444
445When "::" is not in the name, "Encode::" is assumed.
51ef4e11 446
c731e18e 447 @ebcdic = Encode->encodings("EBCDIC");
5d030b67 448
6d1c0808 449To find which encodings are supported by this package in details,
5d030b67 450see L<Encode::Supported>.
51ef4e11 451
452=head2 Defining Aliases
453
67d7b5ef 454To add new alias to a given encoding, Use;
455
5129552c 456 use Encode;
457 use Encode::Alias;
a63c962f 458 define_alias(newName => ENCODING);
51ef4e11 459
3ef515df 460After that, newName can be used as an alias for ENCODING.
f2a2953c 461ENCODING may be either the name of an encoding or an
462I<encoding object>
51ef4e11 463
fcb875d4 464But before you do so, make sure the alias is nonexistent with
465C<resolve_alias()>, which returns the canonical name thereof.
466i.e.
467
468 Encode::resolve_alias("latin1") eq "iso-8859-1" # true
469 Encode::resolve_alias("iso-8859-12") # false; nonexistent
470 Encode::resolve_alias($name) eq $name # true if $name is canonical
471
6d1c0808 472This resolve_alias() does not need C<use Encode::Alias> and is
fcb875d4 473exported via C<use encode qw(resolve_alias)>.
474
5d030b67 475See L<Encode::Alias> on details.
51ef4e11 476
85982a32 477=head1 Encoding via PerlIO
4411f3b6 478
85982a32 479If your perl supports I<PerlIO>, you can use PerlIO layer to directly
480decode and encode via filehandle. The following two examples are
481totally identical by functionality.
4411f3b6 482
85982a32 483 # via PerlIO
484 open my $in, "<:encoding(shiftjis)", $infile or die;
485 open my $out, ">:encoding(euc-jp)", $outfile or die;
486 while(<>){ print; }
8e86646e 487
85982a32 488 # via from_to
489 open my $in, $infile or die;
490 open my $out, $outfile or die;
6d1c0808 491 while(<>){
85982a32 492 from_to($_, "shiftjis", "euc", 1);
493 }
4411f3b6 494
85982a32 495Unfortunately, not all encodings are PerlIO-savvy. You can check if
496your encoding is supported by PerlIO by C<perlio_ok> method.
4411f3b6 497
85982a32 498 Encode::perlio_ok("iso-20220jp"); # false
499 find_encoding("iso-2022-jp")->perlio_ok; # false
500 use Encode qw(perlio_ok); # exported upon request
501 perlio_ok("euc-jp") # true if PerlIO is enabled
4411f3b6 502
85982a32 503For gory details, see L<Encode::PerlIO>;
4411f3b6 504
85982a32 505=head1 Handling Malformed Data
4411f3b6 506
85982a32 507=over 4
47bfe92f 508
85982a32 509THE I<CHECK> argument is used as follows. When you omit it, it is
510identical to I<CHECK> = 0.
47bfe92f 511
85982a32 512=item I<CHECK> = Encode::FB_DEFAULT ( == 0)
47bfe92f 513
85982a32 514If I<CHECK> is 0, (en|de)code will put I<substitution character> in
515place of the malformed character. for UCM-based encodings,
516E<lt>subcharE<gt> will be used. For Unicode, \xFFFD is used. If the
517data is supposed to be UTF-8, an optional lexical warning (category
6d1c0808 518utf8) is given.
e9692b5b 519
85982a32 520=item I<CHECK> = Encode::DIE_ON_ERROR (== 1)
e9692b5b 521
85982a32 522If I<CHECK> is 1, methods will die immediately with an error
523message. so when I<CHECK> is set, you should trap the fatal error
524with eval{} unless you really want to let it die on error.
47bfe92f 525
85982a32 526=item I<CHECK> = Encode::FB_QUIET
47bfe92f 527
85982a32 528If I<CHECK> is set to Encode::FB_QUIET, (en|de)code will immediately
6d1c0808 529return processed part on error, with data passed via argument
530overwritten with unprocessed part. This is handy when have to
85982a32 531repeatedly call because the source data is chopped in the middle for
6d1c0808 532some reasons, such as fixed-width buffer. Here is a sample code that
85982a32 533just does this.
4411f3b6 534
85982a32 535 my $data = '';
536 while(defined(read $fh, $buffer, 256)){
537 # buffer may end in partial character so we append
538 $data .= $buffer;
539 $utf8 .= decode($encoding, $data, ENCODE::FB_QUIET);
540 # $data now contains unprocessed partial character
541 }
1768d7eb 542
85982a32 543=item I<CHECK> = Encode::FB_WARN
67d7b5ef 544
85982a32 545This is the same as above, except it warns on error. Handy when you
546are debugging the mode above.
547
548=item perlqq mode (I<CHECK> = Encode::FB_PERLQQ)
549
550For encodings that are implemented by Encode::XS, CHECK ==
551Encode::FB_PERLQQ turns (en|de)code into C<perlqq> fallback mode.
552
553When you decode, '\xI<XX>' will be placed where I<XX> is the hex
554representation of the octet that could not be decoded to utf8. And
555when you encode, '\x{I<xxxx>}' will be placed where I<xxxx> is the
556Unicode ID of the character that cannot be found in the character
6d1c0808 557repertoire of the encoding.
85982a32 558
559=item The bitmask
560
561These modes are actually set via bitmask. here is how FB_XX are laid
562out. for FB_XX you can import via C<use Encode qw(:fallbacks)> for
563generic bitmask constants, you can import via
564 C<use Encode qw(:fallback_all)>.
565
b0b300a3 566 FB_DEFAULT FB_CROAK FB_QUIET FB_WARN FB_PERLQQ
567 DIE_ON_ERR 0x0001 X
568 WARN_ON_ER 0x0002 X
569 RETURN_ON_ERR 0x0004 X X
570 LEAVE_SRC 0x0008
571 PERLQQ 0x0100 X
67d7b5ef 572
85982a32 573=head2 Unemplemented fallback schemes
67d7b5ef 574
f2a2953c 575In future you will be able to use a code reference to a callback
576function for the value of I<CHECK> but its API is still undecided.
67d7b5ef 577
578=head1 Defining Encodings
579
580To define a new encoding, use:
581
582 use Encode qw(define_alias);
583 define_encoding($object, 'canonicalName' [, alias...]);
584
585I<canonicalName> will be associated with I<$object>. The object
586should provide the interface described in L<Encode::Encoding>
587If more than two arguments are provided then additional
588arguments are taken as aliases for I<$object> as for C<define_alias>.
589
f2a2953c 590See L<Encode::Encoding> for more details.
591
4411f3b6 592=head1 Messing with Perl's Internals
593
47bfe92f 594The following API uses parts of Perl's internals in the current
595implementation. As such they are efficient, but may change.
4411f3b6 596
597=over 4
598
a63c962f 599=item is_utf8(STRING [, CHECK])
4411f3b6 600
601[INTERNAL] Test whether the UTF-8 flag is turned on in the STRING.
47bfe92f 602If CHECK is true, also checks the data in STRING for being well-formed
603UTF-8. Returns true if successful, false otherwise.
4411f3b6 604
a63c962f 605=item _utf8_on(STRING)
4411f3b6 606
607[INTERNAL] Turn on the UTF-8 flag in STRING. The data in STRING is
608B<not> checked for being well-formed UTF-8. Do not use unless you
609B<know> that the STRING is well-formed UTF-8. Returns the previous
610state of the UTF-8 flag (so please don't test the return value as
611I<not> success or failure), or C<undef> if STRING is not a string.
612
a63c962f 613=item _utf8_off(STRING)
4411f3b6 614
615[INTERNAL] Turn off the UTF-8 flag in STRING. Do not use frivolously.
616Returns the previous state of the UTF-8 flag (so please don't test the
617return value as I<not> success or failure), or C<undef> if STRING is
618not a string.
619
620=back
621
622=head1 SEE ALSO
623
5d030b67 624L<Encode::Encoding>,
625L<Encode::Supported>,
6d1c0808 626L<Encode::PerlIO>,
5d030b67 627L<encoding>,
6d1c0808 628L<perlebcdic>,
629L<perlfunc/open>,
630L<perlunicode>,
631L<utf8>,
5d030b67 632the Perl Unicode Mailing List E<lt>perl-unicode@perl.orgE<gt>
4411f3b6 633
85982a32 634=head1 MAINTAINER
aae85ceb 635
636This project was originated by Nick Ing-Simmons and later maintained
637by Dan Kogai E<lt>dankogai@dan.co.jpE<gt>. See AUTHORS for full list
638of people involved. For any questions, use
639E<lt>perl-unicode@perl.orgE<gt> so others can share.
640
4411f3b6 641=cut