#!/usr/bin/perl use strict; use warnings; use Encode; # Assume the initial default encoding is iso-8859-1 # We leave STDOUT to the standard encoding too, because we presume it corresponds # to your locale and terminal emulation settings my $fname_iso = "Presentación.txt"; # fname_iso is bytes print " creating file1 [$fname_iso] " . (Encode::is_utf8($fname_iso) ? "(utf8)" : "(bytes)") . "\n"; open(F1,'>',$fname_iso) or die "cannot open F1 : $!"; close F1; my $fname_utf8 = decode('iso-8859-1',$fname_iso); # fname_utf8 is utf8 and utf8-marked # the "o acute" should now be 2 bytes print " creating file2 [$fname_utf8] " . (Encode::is_utf8($fname_utf8) ? "(utf8)" : "(bytes)") . "\n"; open(F2,'>',$fname_utf8) or die "cannot open F2 : $!"; close F2; my $numfiles; my $dir_iso = "."; # iso bytes by default print "testing with path [$dir_iso] " . (Encode::is_utf8($dir_iso) ? "(utf8)" : "(bytes)") . "\n"; $numfiles = dirread($dir_iso); print "result : $numfiles files found\n"; my $dir_utf = decode('iso-8859-1',$dir_iso); # force internal utf8 print "testing with path [$dir_utf] " . (Encode::is_utf8($dir_utf) ? "(utf8)" : "(bytes)") . "\n"; $numfiles = dirread($dir_utf); print "result : $numfiles files found\n"; exit 0; sub dirread { my $path = shift; my $fullpath; my $numfiles = 0; opendir(DIR,$path); my @entries = readdir DIR; close DIR; foreach (@entries) { next if $_ =~ /^\./; next if $_ =~ /\.pl$/; # skip myself too print "dirread() : checking entry [$_] " . (Encode::is_utf8($_) ? "(utf8)" : "(bytes)") . "\n"; # should always be 'bytes' $fullpath = $path . '/' . $_ ; print "dirread() : full path is [$fullpath] " . (Encode::is_utf8($fullpath) ? "(utf8)" : "(bytes)") . "\n"; if (-f $fullpath) { #print " passes the -f test,"; unless (open(F1,'<',$fullpath) ) { #print " but cannot be opened : $!\n"; } else { print " ... passes !\n"; close F1; $numfiles++; } } else { print " ... fails the -f test !\n"; unless (open(F1,'<',$fullpath) ) { #print " and fails the open() : $!\n"; } } } return $numfiles; }