Signaler

Problème accent fichiers Perl TK [Résolu]

Posez votre question Jamie MacUloth - Dernière réponse le 15 févr. 2017 à 23:08 par Jamie MacUloth
Bonjour,
Config: Perl 5, IDE Padre 0.842
1) Sans use TK, je n'ai pas de problème lorsque je liste les fichiers accentués présents d'un répertoire $DIR.
J'utilise cette fonction pour récupérer la liste des fichiers, cette fonction est appelée et prend en entrée $DIR:



my @Files = GetFilesList ($DIR);#liste des fichiers d'un dossier de chemin $DIR.

sub GetFilesList
{

my $path = $_[0];
use Encode;
opendir my $dh, $path or warn "Error: $!";
my @p_files = grep !/^\.\.?$/, readdir $dh;
closedir $dh;
@p_files = map { decode( 'UTF-8', "$path/".$_ ) } sort @p_files;

return @p_files;

}




==> Il lit les fichiers même avec accent sans problème. Je l'observe comme ceci en écrivant le contenu de la liste des fichiers dans un txt:




my $fileText = 'report.txt';
open(my $fh, '>', $fileText) or die "Could not open file '$fileText' $!";

my $sizeFiles = scalar @Files;
print("sizeFiles = $sizeFiles\n");
for(my $k = 0; $k<$sizeFiles; $k++)
{

print("Files[k] = $Files[$k]\n");
print $fh "Files[k] = $Files[$k]\n";
}

close $fh;



2) Même chose avec use TK dans MainLoop ==> accents non reconnus!!!
J'ai passé quasi une semaine à lire des forums et à tester des solutions mais aucune ne marche. Par exemple celle-ci (qui vient de https://perl.developpez.com/faq/tk/?page=Astuces-et-divers%29 :

Avant de printer, dans mon for précédent:



$File[$k] = encode( 'iso-8859-1', $File[$k] );



==> J'ai essayé avec utf8, UTF-8, cp1252..... je suis à court d'idée et, aussi un peu désespéré. Pourquoi ce qui marche en Perl sans TK ne fonctionne plus dans un MainLoop du TK??

Je précise que je travaille avec les packages use Encode, use utf8

Je remercie vivement d'avance celles ou ceux qui comme moi ont galéré sur ce sujet et ont pu débloquer la situation.

Afficher la suite 
Utile
+0
plus moins
Salut,

Ce n'est pas très clair ce que tu fais avec Tk

use utf8
est juste pour pouvoir utiliser de l'UTF-8 dans ton code source, et ne t'aide probablement pas dans ton problème.

Dans ta boucle Tk, est-ce que tu récupères des données en UTF-8, si oui, tu dois faire
decode( 'UTF-8', ...
(comme dans ton cas initial) pour qu'elles soient dans le format de représentation interne de Perl.

Si tu récupères des données dans un autre format, tu dois faire un
decode()
avec le bon format.

Si ton souci est au niveau des affichages sur stdout, et que ton affichage est en utf-8, tu peux aussi essayer de paramétrer
binmode(STDOUT, ":utf8");
avant tes print, pour faire la conversion systématiquement sur ce descripteur de fichiers.

http://perldoc.perl.org/perlunifaq.html#What-is-a-%22wide-character%22?

Sinon, tu dois faire un
encode( 'UTF-8', ...
avant d'afficher.

http://perldoc.perl.org/perlunitut.html#I/O-flow-%28the-actual-5-minute-tutorial%29


Dal
Donnez votre avis
Utile
+0
plus moins
D'abord j'aimerais te remercier Dal pour tes explications. Elles m'ont été super utiles. Je comprends mieux ce que signifie le decode. Après avoir pas mal tergiversé, j'ai utilisé ce que tu m'as dit pour le decode mais ça ne suffisait pas.
J'ai fait alors un truc que je n'ai pas compris mais que j'ai trouvé sur un forum:
# Windows
my $OS = lc($^O);
if ( $OS eq 'mswin32' ) {
$Directory = encode( 'iso-8859-1', $Directory );
}

Je sais pas pourquoi mais en faisant ça et ce que tu m'as dit, à savoir décoder mes fichiers $FilesList récupérés dans le répertoire:

$FilesList[$k] = decode( 'UTF-8', $FilesList[$k] );

Et bien $FilesList[$k] contient alors bien les accents comme il faut. Ce qui est bizarre du coup pour moi, c'est le coup du encode du répertoire. J'ai pas compris pourquoi mais en ajoutant ça, ça marche...
En tout cas merci encore!!

Jamie MacUloth
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !