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

9 réponses

1 2
Avatar
Nicolas George
Une bévue wrote in message
<1hcyvsn.90k2u2180roq0N%:
truc perl qui est mal conçu, on mal utilisé par moi


Mal utilisé par toi, comme la doc l'indique :

But it will croak if:

* Two or more suspects remain

Avatar
pere.noel
Paul Gaborit wrote:

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


ok, merci beaucoup, c'est ce que je ne savait pas faire en perl...
j'image que je peux continuer avec d'autres suspects en reprenant la
même structure...

ça marche "impec" sur mes fichiers :
print guessEncoding("ruby-cocoa--ASCII.html");
print guessEncoding("apple-mac-roman--ISO-8859-1.html");
print guessEncoding("comparaison-encodages--ISO-8859-1.html");
print guessEncoding("cp1252--UTF-8.htm");
print guessEncoding("Frap--CP-1252.html");

ça me donne :
ascii
iso-8859-1
iso-8859-1
utf8
iso-8859-1

le dernier est faux, oeuf corse, car je n'ai pas mis CP1252 dans les
guess.

ceci dit, c'est quasiment impossible de détecter les variantes
iso-8859-(n) versus les cpwxyz et les Mac* pour y arriver il faut
simultanément déter la langue...
--
une bévue

Avatar
pere.noel
Nicolas George <nicolas$ wrote:

Mal utilisé par toi, comme la doc l'indique :

But it will croak if:

* Two or more suspects remain


ouais, m'enfin il reste que l'utf-8 est indubitable.

Paul Gaborit m'a donné le bon tuyau question code, je connais trè peu
perl...
--
une bévue

Avatar
Paul Gaborit
À (at) Wed, 29 Mar 2006 17:33:36 +0200,
(Une bévue) écrivait (wrote):
ouais, m'enfin il reste que l'utf-8 est indubitable.


Oui et non... C'est semi-décidable.

Si ce n'est pas de l'utf-8, on en est sûr. Mais l'iso-8859-* est
toujours possible.

Donc, soit ce n'est pas de l'utf-8 et ça ne peut qu'être de
l'iso-8859-* (mais lequel ?). Soit c'est possiblement de l'utf-8 mais
ça peut aussi être de l'iso-8859-*.

Ce qui est peut-être bizarre dans le module, c'est que de l'ascii pur
est considéré comme ('ascii') et non comme ('ascii' ou 'utf-8') ou
même comme ('ascii', 'utf-8' ou 'iso-8859-*'). Mais cela peut
s'expliquer par le fait que le choix entre l'un ou l'autre ne changera
rien à l'interprétation. Alors que le choix entre utf-8 et l'un des
iso-8859-* change tout.

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

Avatar
pere.noel
Paul Gaborit wrote:

Si ce n'est pas de l'utf-8, on en est sûr. Mais l'iso-8859-* est
toujours possible.


ben justement je ne suis pas d'azccord là-dessus :

si c'est de l'ascii pur c'est décidable de manière certaine :
asciirgx=Regexp.new('A([x09x0Ax0Dx20-x7E])*Z', Regexp::EXTENDED,
'N')

l'utf-8 qui contient aussi l'ascii est décidable après avoir éliminé le
cas de l'ascii pur :
utf8rgx=Regexp.new('A(
[x09x0Ax0Dx20-x7E] # ASCII
| [xC2-xDF][x80-xBF] # non-overlong 2-byte
| xE0[xA0-xBF][x80-xBF] # excluding overlongs
| [xE1-xECxEExEF][x80-xBF]{2} # straight 3-byte
| xED[x80-x9F][x80-xBF] # excluding surrogates
| xF0[x90-xBF][x80-xBF]{2} # planes 1-3
| [xF1-xF3][x80-xBF]{3} # planes 4-15
| xF4[x80-x8F][x80-xBF]{2} # plane 16
)*Z', Regexp::EXTENDED, 'N')

je ne pense pas qu'un fichier iso-8859-(n) puisse répondre à cette
regexp.

en tout cas sur tous les exemples que j'ai passé (pas si nombreux que ça
disons une 40taine) je n'ai jamais vu de fausse détection utf-8 càd un
iso intérprété comme de l'utf-8 alors que dans mes exemples les iso sont
nettement plus nombreux, disons, à la louche, dix fois plus nombreux.

c'est après, amha, la galère...

--
une bévue

Avatar
Paul Gaborit
À (at) Wed, 29 Mar 2006 18:43:20 +0200,
(Une bévue) écrivait (wrote):
[...]
je ne pense pas qu'un fichier iso-8859-(n) puisse répondre à cette
regexp.


C'est dans l'autre sens que ça ne marche pas. Tout fichier utf-8 est
aussi un fichier valide pour n'importe quel iso-8859-*.

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

Avatar
pere.noel
Paul Gaborit wrote:


C'est dans l'autre sens que ça ne marche pas.
dans ce cas, il faut bien tester utf-8 en second, après ascii.

Tout fichier utf-8 est
aussi un fichier valide pour n'importe quel iso-8859-*.
comme je fais il n'y a plus de fichier utf-8 quand je regarde les iso.


--
une bévue

Avatar
Nicolas George
Une bévue wrote in message
<1hcz88w.kqhr8ru0kmjnN%:
dans ce cas, il faut bien tester utf-8 en second, après ascii.


Et la doc de Encode::Guess dit que ce module ne teste pas dans l'ordre, mais
considère tous les candidats de manière équivalente. C'est éventuellement à
toi, derrière, d'ajouter les priorités que tu veux.

Avatar
pere.noel
Nicolas George <nicolas$ wrote:


Et la doc de Encode::Guess dit que ce module ne teste pas dans l'ordre, mais
considère tous les candidats de manière équivalente. C'est éventuellement à
toi, derrière, d'ajouter les priorités que tu veux.


ok, merci
--
une bévue

1 2