Problème accent fichiers Perl TK

Résolu/Fermé
Jamie MacUloth - 15 févr. 2017 à 17:25
 Jamie MacUloth - 15 févr. 2017 à 23:08
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.

2 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 15/02/2017 à 18:12
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.

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

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

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


Dal
0
Jamie MacUloth
15 févr. 2017 à 23:08
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
0