OVH Cloud OVH Cloud

encodage...

16 réponses
Avatar
kurtz le pirate
bonsoir,

avant d'essayer de faire un script pour décoder un fichier 'ansel' en
'ascii', je voulais savoir si ça existait déjà en perl un peux comme
quand on écrit :

open ($InputFile, "<:utf8", "toto.txt")

j'ai pas trouver d'infos à ce sujet.
merci

10 réponses

1 2
Avatar
Nicolas George
kurtz le pirate wrote in message
:
avant d'essayer de faire un script pour décoder un fichier 'ansel' en


« ansel », connais pas.

open ($InputFile, "<:utf8", "toto.txt")


"<:encoding(EBCDIC)"

Cf. la doc de binmode pour plus de détails.

Avatar
Patrick Texier
Le Tue, 19 Jul 2005 17:10:00 +0000 (UTC), Nicolas George
<nicolas$ a écrit :

avant d'essayer de faire un script pour décoder un fichier 'ansel' en


« ansel », connais pas.


Tu ne perds rien. Je ne l'ai trouvé que pour transmettre des données
généalogiques au format Gedcom.

La conversion a cette tête là (je l'ai pompée sur ged2gen.pl un script
disponible sur le ftp de Geneanet <ftp://ftp.geneanet.org>) :

$_[0] =~ s/áa/à/g;
$_[0] =~ s/áe/è/g;

L'accent (ou title, ligature, cédille...) est codé par un caractère
8 bits avant la lettre.

C'est à ne plus utiliser et à remplacer par ISO-8859-1 voire UTF-8, mais
on doit effectivement pouvoir le lire.
--
Patrick Texier

Tous les résultats de GP F1 librement téléchargeables
http://www.genindre.org/perso/f1.htm


Avatar
Nicolas George
Patrick Texier wrote in message :
Tu ne perds rien. Je ne l'ai trouvé que pour transmettre des données
généalogiques au format Gedcom.


Hum, dans ce cas, je doute que perl ait quoi que ce soit nativement pour
faire ça.

Ceci dit, tel que tu le décris, aucune chance de convertir ça en ASCII. Je
rappelle qu'ASCII, c'est espace!"#$%&'()*+,-./0123456789:;<=>?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~ et quelques
codes de contrôle, et rien d'autre.

Avatar
Patrick Texier
Le Tue, 19 Jul 2005 22:21:03 +0000 (UTC), Nicolas George
<nicolas$ a écrit :

Tu ne perds rien. Je ne l'ai trouvé que pour transmettre des données
généalogiques au format Gedcom.


Hum, dans ce cas, je doute que perl ait quoi que ce soit nativement pour
faire ça.

Ceci dit, tel que tu le décris, aucune chance de convertir ça en ASCII.


Oui, c'est un abus de langage du questionneur.

ANSEL est un vieux encodage américain (1985) défini par l'ANSI pour des
usages bibliographiques : American National Standard for Extended Latin
Alphabet Codes Character Set for Bibliographic Use. Il porte la
référence ANSI Z39.47-1985. Ni Perl, ni iconv le gèrent.


Avatar
jl_morel
Dans l'article , a
dit...

ANSEL est un vieux encodage américain (1985) défini par l'ANSI pour des
usages bibliographiques : American National Standard for Extended Latin
Alphabet Codes Character Set for Bibliographic Use. Il porte la
référence ANSI Z39.47-1985. Ni Perl, ni iconv le gèrent.



Il existe malgré tout le module MARC (MAchine Readable Cataloging) qui
permet de manipuler des données bibliographiques.
Il gère apparemment ANSEL, voir :

http://search.cpan.org/~esummers/MARC-Charset-0.6/lib/MARC/Charset/Ansel.pm

HTH

--
J-L.M.
http://www.bribes.org/perl

Avatar
kurtz_le_pirate
"Patrick Texier" a écrit dans le message de
news:
| Le Tue, 19 Jul 2005 17:10:00 +0000 (UTC), Nicolas George
|
| > > avant d'essayer de faire un script pour décoder un fichier
'ansel' en
| >
| > « ansel », connais pas.
|
| Tu ne perds rien. Je ne l'ai trouvé que pour transmettre des données
| généalogiques au format Gedcom.

ben c'est exactement pour ça !!


| La conversion a cette tête là (je l'ai pompée sur ged2gen.pl un
script
| disponible sur le ftp de Geneanet <ftp://ftp.geneanet.org>) :
|
| $_[0] =~ s/áa/à/g;
| $_[0] =~ s/áe/è/g;
|
| L'accent (ou title, ligature, cédille...) est codé par un caractère
| 8 bits avant la lettre.


... un peu "courte" ta conversion :)))
en fait les correspondances (1 à 1) sont :

ANSELTABLE :
('âe','áe','ãe','èe','âo','áo','ão','èo','âa','áa','ãa','èa','âu','áu','ãu','èu','âi','ái','ãi','èi','ây','èy','ðc','~n',
'âE','áE','ãE','èE','âO','áO','ãO','èO','âA','áA','ãA','èA','âU','áU','ãU','èU','âI','áI','ãI','èI','âY','èY','ðC','~N')

ANSITABLE : ('é', 'è', 'ê', 'ë', 'ó', 'ò', 'ô', 'ö', 'á', 'à', 'â',
'ä', 'ú', 'ù', 'û', 'ü', 'í', 'ì', 'î', 'ï', 'ý', 'ÿ', 'ç', 'ñ',
'É', 'È', 'Ê', 'Ë', 'Ó', 'Ò', 'Ô', 'Ö', 'Á', 'À', 'Â', 'Ä', 'Ú',
'Ù', 'Û', 'Ü', 'Í', 'Ì', 'Î', 'Ï', 'Ý', 'Y', 'Ç', 'Ñ')

je me demande donc si on peut faire un hash sur 2 caractères ?



merci
Avatar
Patrick Texier
Le 20 Jul 2005 07:17:37 GMT, (Jean-Louis MOREL) a
écrit :

Il existe malgré tout le module MARC (MAchine Readable Cataloging) qui
permet de manipuler des données bibliographiques.
Il gère apparemment ANSEL, voir :

http://search.cpan.org/~esummers/MARC-Charset-0.6/lib/MARC/Charset/Ansel.pm


Merci. Il convertit effectivement ANSEL en UTF-8. Personellement je l'ai
adopté pour faire un convertisseur.

Avatar
Paul Gaborit
À (at) Tue, 19 Jul 2005 22:51:32 +0200,
Patrick Texier écrivait (wrote):
La conversion a cette tête là (je l'ai pompée sur ged2gen.pl un script
disponible sur le ftp de Geneanet <ftp://ftp.geneanet.org>) :

$_[0] =~ s/áa/à/g;
$_[0] =~ s/áe/è/g;

L'accent (ou title, ligature, cédille...) est codé par un caractère
8 bits avant la lettre.


Ce script est codé... heu... bizarrement. Bon, ceci étant, il a le
mérite d'exister ! ;-)

Juste une remarque concernant la subroutine 'processaccents':
l'utilisation successive de plusieurs 's/.../.../g' sur une même
variable est toujours risquée car on peut produire accidentellement
des suites de caractères qui seront ensuite recodées une deuxième
fois... Par exemple, telle qu'est écrite cette subroutine, "âaa" sera
recodé en "à" alors qu'on devrait obtenir "áa" !

Une "bonne" méthode consiste à créer une table de hachage de
transformation et une regexp de reconnaissance générale :

my %ANSEL_to_LATIN1 =
(
'áa' => 'à',
'áe' => 'è',
# ...
# à compléter !
);
my $ansel_regex = join "|", keys sort %ANSEL_to_LATIN1;

Puis à faire toutes les substitutions en une seule passe :

$_[0] =~ s/($ansel_regex)/$ANSEL_to_LATIN1{$1}/ge;

(ce code simple ne fonctionne que si les clés utilisées dans
%ANSEL_to_LATIN1 ne contiennent pas de caractères spéciaux pour les
regexp ce qui sera le cas ici.)

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

Avatar
Michel Rodriguez
Paul Gaborit wrote:

Une "bonne" méthode consiste à créer une table de hachage de
transformation et une regexp de reconnaissance générale :

my %ANSEL_to_LATIN1 =
(
'áa' => 'à',
'áe' => 'è',
# ...
# à compléter !
);
my $ansel_regex = join "|", keys sort %ANSEL_to_LATIN1;

Puis à faire toutes les substitutions en une seule passe :

$_[0] =~ s/($ansel_regex)/$ANSEL_to_LATIN1{$1}/ge;

(ce code simple ne fonctionne que si les clés utilisées dans
%ANSEL_to_LATIN1 ne contiennent pas de caractères spéciaux pour les
regexp ce qui sera le cas ici.)



Pour etre complet, si les cles contiennent des caracteres speciaux, un
simple Q E les de-specialisera:

$_[0] =~ s/(Q$ansel_regexE)/$ANSEL_to_LATIN1{$1}/ge;

--
mirod

Avatar
kurtz_le_pirate
"Michel Rodriguez" a écrit dans le message de news:
42df55cd$0$333$
| Paul Gaborit wrote:
| >
| > Une "bonne" méthode consiste à créer une table de hachage de
| > transformation et une regexp de reconnaissance générale :
| >
| > my %ANSEL_to_LATIN1 | > (
| > 'áa' => 'à',
| > 'áe' => 'è',
| > # ...
| > # à compléter !
| > );
| > my $ansel_regex = join "|", keys sort %ANSEL_to_LATIN1;
| >
| > Puis à faire toutes les substitutions en une seule passe :
| >
| > $_[0] =~ s/($ansel_regex)/$ANSEL_to_LATIN1{$1}/ge;
| >
| > (ce code simple ne fonctionne que si les clés utilisées dans
| > %ANSEL_to_LATIN1 ne contiennent pas de caractères spéciaux pour
les
| > regexp ce qui sera le cas ici.)
| >
|
| Pour etre complet, si les cles contiennent des caracteres speciaux,
un
| simple Q E les de-specialisera:
|
| $_[0] =~ s/(Q$ansel_regexE)/$ANSEL_to_LATIN1{$1}/ge;
|
| --
| mirod

donc avec un truc du genre :
------------------------------------------------------------------------------
my $srcfile = "toto.txt";
my $dstfile = "tata.txt";
my $line;

my %ANSEL_to_LATIN1 = (
'áa' => 'à',
...
);
my $ansel_regex = join "|", keys sort %ANSEL_to_LATIN1;

open(SRC, $srcfile);
open(DST, $dstfile);

while($line=<SRC>) {
$line =~ s/($ansel_regex)/$ANSEL_to_LATIN1{$1}/ge;
# $line =~ s/(Q$ansel_regexE)/$ANSEL_to_LATIN1{$1}/ge;
print DST $line;
)

close(DST);
close(SRC);

------------------------------------------------------------------------------
ca devrait le faire non ?


merci beaucoup de votre aide
1 2