my $locale_encoding;
-sub in_locale { $^H & $locale::hint_bits }
+sub in_locale { $^H & ($locale::hint_bits || 0)}
sub _get_locale_encoding {
unless (defined $locale_encoding) {
} elsif ($country_language =~ /^zh_CN|chin(?:a|ese)?$/i) {
$locale_encoding = 'euc-cn';
} elsif ($country_language =~ /^zh_TW|taiwan(?:ese)?$/i) {
- $locale_encoding = 'big5';
+ $locale_encoding = 'euc-tw';
}
croak "Locale encoding 'euc' too ambiguous"
if $locale_encoding eq 'euc';
sub import {
my ($class,@args) = @_;
croak("`use open' needs explicit list of disciplines") unless @args;
+ my $std;
$^H |= $open::hint_bits;
my ($in,$out) = split(/\0/,(${^OPEN} || "\0"), -1);
while (@args) {
if ($type =~ /^:?(utf8|locale|encoding\(.+\))$/) {
$type = 'IO';
$dscp = ":$1";
+ } elsif ($type eq ':std') {
+ $std = 1;
+ next;
} else {
$dscp = shift(@args) || '';
}
} else {
$layer = "encoding($locale_encoding)";
}
+ $std = 1;
} else {
- unless(PerlIO::Layer::->find($layer)) {
+ my $target = $layer; # the layer name itself
+ $target =~ s/^(\w+)\(.+\)$/$1/; # strip parameters
+
+ unless(PerlIO::Layer::->find($target)) {
carp("Unknown discipline layer '$layer'");
}
}
$^H{"open_$type"} = $layer;
}
}
- # print "# type = $type, val = @val\n";
if ($type eq 'IN') {
$in = join(' ',@val);
}
}
}
${^OPEN} = join("\0",$in,$out) if $in or $out;
+ if ($std) {
+ if ($in) {
+ if ($in =~ /:utf8\b/) {
+ binmode(STDIN, ":utf8");
+ } elsif ($in =~ /(\w+\(.+\))/) {
+ binmode(STDIN, ":$1");
+ }
+ }
+ if ($out) {
+ if ($out =~ /:utf8\b/) {
+ binmode(STDOUT, ":utf8");
+ binmode(STDERR, ":utf8");
+ } elsif ($out =~ /(\w+\(.+\))/) {
+ binmode(STDOUT, ":$1");
+ binmode(STDERR, ":$1");
+ }
+ }
+ }
}
1;
use open ':locale';
use open ':encoding(iso-8859-7)';
+ use open ':std';
+
=head1 DESCRIPTION
Full-fledged support for I/O disciplines is now implemented provided
When open() is given an explicit list of layers they are appended to
the list declared using this pragma.
+The C<:std> subpragma on its own has no effect, but if combined with
+the C<:utf8> or C<:encoding> subpragmas, it converts the standard
+filehandles (STDIN, STDOUT, STDERR) to comply with encoding selected
+for input/output handles. For example, if both input and out are
+chosen to be C<:utf8>, a C<:std> will mean that STDIN, STDOUT, and
+STDERR are also in C<:utf8>. On the other hand, if only output is
+chosen to be in C<< :encoding(koi8r) >>, a C<:std> will cause only the
+STDOUT and STDERR to be in C<koi8r>. The C<:locale> subpragma
+implicitly turns on C<:std>.
+
The logic of C<:locale> is as follows:
=over 4
=back
+If your locale environment variables (LANGUAGE, LC_ALL, LC_CTYPE, LANG)
+contain the strings 'UTF-8' or 'UTF8' (case-insensitive matching),
+the default encoding of your STDIN, STDOUT, and STDERR, and of
+B<any subsequent file open>, is UTF-8.
+
Directory handles may also support disciplines in future.
=head1 NONPERLIO FUNCTIONALITY