OVH Cloud OVH Cloud

décodage de l'encodage et perl

19 réponses
Avatar
pere.noel
j'ai écris un petit script perl pour décoder l'encodage de fichiers html
avec Encode:: Guess

mais perl couine :
Can't locate object method "name" via package "iso-8859-1 or utf8"
(perhaps you forgot to load "iso-8859-1 or utf8"?) at
/Users/yvon/work/Perl/encoding-check/check_files.pl line 24.


voici ce qu'il y a dans use :
use Encode::Encoding;
use Encode::Guess;
#use Encode::iso-8859-1;
use utf8;
#use iso-8859-1; # ne trouve pas iso.pm
use base qw(Encode::Encoding);

ma version de perl est v5.8.8


pourtant, quand je liste les encodages par défaut j'ai :
Default :
ascii
ascii-ctrl
iso-8859-1
null
UCS-2BE
UCS-2LE
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
utf-8-strict
utf8


je ne vois pas comment obtenir iso-8859-1 ni ne comprends le message
d'erreur...
d'autant plus que utf-8 semble bien chargé par le use utf8...

mon script complet :

#!/usr/bin/perl

use Encode::Encoding;
use Encode::Guess;
#use Encode::iso-8859-1;
use utf8;
#use iso-8859-1;
use base qw(Encode::Encoding);
#use latin1;
#use Unicode;

sub guessEncoding
{
my ($fn) = @_;
my $string;
{
local $/;
open F, $fn or die "can't open $file: $!";
$string = <F>;
close F or die "cannot close $file: $!";
}
Encode::Guess->add_suspects('latin1');
my $decoder = Encode::Guess->guess($string);
return $decoder->name;
}

print guessEncoding("apple-mac-roman--ISO-8859-1.html");
print "\n";
print guessEncoding("comparaison-encodages--ISO-8859-1.html");
print "\n";
print guessEncoding("cp1252--UTF-8.htm");
print "\n";
print guessEncoding("Frap--CP-1252.html");
print "\n";



--
une bévue

10 réponses

1 2
Avatar
Nicolas George
Une bévue wrote in message
<1hcwm6w.10qp3ade6ixirN%:
pourtant, quand je liste les encodages par défaut j'ai :
...

iso-8859-1
...

je ne vois pas comment obtenir iso-8859-1


Euh, tu l'as déjà. Pour les encodages plus exotiques, cf la doc de
Encode::Supported, qui n'est pas un package mais indique les noms des
packages à inclure pour telle ou telle famille d'encodages.

d'autant plus que utf-8 semble bien chargé par le use utf8...


Non, rien à voir. use utf8 dit seulement que l'encodage du fichier contenant
le source du script est UTF-8.

Avatar
pere.noel
Nicolas George <nicolas$ wrote:


Euh, tu l'as déjà.


c'est vrai, je me gourate...

Pour les encodages plus exotiques, cf la doc de
Encode::Supported, qui n'est pas un package mais indique les noms des
packages à inclure pour telle ou telle famille d'encodages.

d'autant plus que utf-8 semble bien chargé par le use utf8...


Non, rien à voir. use utf8 dit seulement que l'encodage du fichier contenant
le source du script est UTF-8.


ah d'accord, mais alors comment charger l'utf-8 ?

car si je met :
Encode::Guess->add_suspects('latin1', 'utf8');

ça me retourne :
iso-8859-1 or utf8 at
/Users/yvon/work/Perl/encoding-check/check_files.pl line 25.

pour le premier fichier encodé en UTF-8, et comme dans ce fichier (qui
est la table de CP-1252) il y a des é è etc... je ne vois pas comment
perl peut hésiter ?


par ailleurs si je print les encodages par défaut par :

print "Default :n";
foreach $v ( Encode->encodings())
{
print "$vn";
}

j'obtiens la liste :
Default :
ascii
ascii-ctrl
iso-8859-1
null
UCS-2BE
UCS-2LE
UTF-16
UTF-16BE
UTF-16LE
UTF-32
UTF-32BE
UTF-32LE
utf-8-strict
utf8

comment charger les encodages correspondants ???

--
une bévue


Avatar
Nicolas George
Une bévue wrote in message
<1hcx1ya.1jtnxx7pmzx8iN%:
ah d'accord, mais alors comment charger l'utf-8 ?


Il est aussi déjà chargé, regarde ta liste.

pour le premier fichier encodé en UTF-8, et comme dans ce fichier (qui
est la table de CP-1252) il y a des é è etc... je ne vois pas comment
perl peut hésiter ?


Essaie avec utf-8-strict.

comment charger les encodages correspondants ???


Ils sont déjà chargés, s'ils sont dans la liste. C'est précisément à ça que
sert la liste.

Avatar
pere.noel
Nicolas George <nicolas$ wrote:


Essaie avec utf-8-strict.


résultat :
utf-8-strict or iso-8859-1 or utf8 at
/Users/yvon/work/Perl/encoding-check/check_files.pl line 25.


donc, je fais moins bien avec Perl qu'avec ma méthode...

--
une bévue

Avatar
Nicolas George
Une bévue wrote in message
<1hcx3jk.1g6q7hg1963afN%:
résultat :
utf-8-strict or iso-8859-1 or utf8 at
/Users/yvon/work/Perl/encoding-check/check_files.pl line 25.

donc, je fais moins bien avec Perl qu'avec ma méthode...


Est-ce qu'on pourrait voir les fichiers en question, sans conversion
aucune ? Les uploader sur une page web serait la manière la plus fiable pour
ça.

Au fait, c'est quelle version de perl ?

Avatar
pere.noel
Nicolas George <nicolas$ wrote:


Est-ce qu'on pourrait voir les fichiers en question, sans conversion
aucune ? Les uploader sur une page web serait la manière la plus fiable pour
ça.

ben oui, pas de raison, c'est un mélange de fichiers de provenaces

diverses tout est là, pelle-melle :
<http://thoraval.yvon.free.fr/encoding-check-new/>

les noms de fichiers se terminent par leur encodage.

Au fait, c'est quelle version de perl ?


perl --version

This is perl, v5.8.8 built for darwin-2level

--
une bévue

Avatar
pere.noel
Une bévue wrote:

<http://thoraval.yvon.free.fr/encoding-check-new/>


oups, il fallait lire ;-) :

<http://thoraval.yvon.free.fr/encoding-check-new_orig/>

--
une bévue

Avatar
Nicolas George
Une bévue wrote in message
<1hcyajp.h8t5bs1kx7v8vN%:
ben oui, pas de raison, c'est un mélange de fichiers de provenaces
diverses tout est là, pelle-melle :
<http://thoraval.yvon.free.fr/encoding-check-new/>

les noms de fichiers se terminent par leur encodage.


En fait, si tu regardes bien, tu vois que ce sont les fichiers en UTF-8 sur
lesquels la détection échoue. Ce qui est normal, puisque n'importe quel
fichier est un fichier valide en ISO-8859-1 (les codes 0x80-0x9F sont des
codes de contrôle, mais font partie du jeu de plein droit).

Avatar
pere.noel
Nicolas George <nicolas$ wrote:

En fait, si tu regardes bien, tu vois que ce sont les fichiers en UTF-8 sur
lesquels la détection échoue. Ce qui est normal, puisque n'importe quel
fichier est un fichier valide en ISO-8859-1 (les codes 0x80-0x9F sont des
codes de contrôle, mais font partie du jeu de plein droit).


non, je ne trouve pas ça normal *** du tout *** si on guess ascii et
UTF-8 d'abord, et qu'on trouve l'un des deux encodages, on a pas à
revenir dessus (ascii < 127, utf-! codé sur plus d'un octet), c'est le
truc perl qui est mal conçu, on mal utilisé par moi, en fait avec mon
prog ruby, je teste d'abord ascii et utf-8 tout le reste je le met en
ISO-8859-1 et puis je re-mouline pour affiner.

alors peut-être qu'avec perl il y a cette même possibilité "guesser"
d'abord uniquement ascii et utf-8 puis après seulement le reste... sur
les fichiers qui ne sont ni l'un ni l'autre.

pour moi ré-essayer avec perl il faut que je sois sur que ça m'apporte
qqc notamment du côté des encodages +/- exotiques cp-1252; iso-8859-2
etc...

le pb est que je ne veux pas que l'utilisateur final ait à installer qqc
d'autre que mon appli par glissé-déposé.
--
une bévue

Avatar
Paul Gaborit
À (at) Wed, 29 Mar 2006 15:24:38 +0200,
(Une bévue) écrivait (wrote):
non, je ne trouve pas ça normal *** du tout *** si on guess ascii et
UTF-8 d'abord, et qu'on trouve l'un des deux encodages, on a pas à
revenir dessus (ascii < 127, utf-! codé sur plus d'un octet), c'est le
truc perl qui est mal conçu, on mal utilisé par moi, en fait avec mon
prog ruby, je teste d'abord ascii et utf-8 tout le reste je le met en
ISO-8859-1 et puis je re-mouline pour affiner.

alors peut-être qu'avec perl il y a cette même possibilité "guesser"
d'abord uniquement ascii et utf-8 puis après seulement le reste... sur
les fichiers qui ne sont ni l'un ni l'autre.


Voici une version modifiée que fait peut-être ce que vous souhaitez :

------------------------------------------------------------
sub guessEncoding {
my ($fn) = @_;
my $string;
{
local $/;
open F, $fn or die "can't open $fn: $!";
$string = <F>;
close F or die "cannot close $fn: $!";
}
Encode::Guess->set_suspects(qw/ascii utf8/);
my $decoder = Encode::Guess->guess($string);
if (ref $decoder) {
return $decoder->name;
} else {
Encode::Guess->set_suspects(qw/latin-1/);
my $decoder = Encode::Guess->guess($string);
if (ref $decoder) {
return $decoder->name;
} else {
die "$fn : $decodern";
}
}
}
------------------------------------------------------------

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

1 2