Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème de transmission de fichier & d'encodage (CGI)

5 réponses
Avatar
paul POULAIN
Hello,

J'ai un script Perl qui permet de transmettre (via apache) un fichier au
format iso2709. (C'est un format semi-binaire de bibliothécaire : des trucs
en clair et des trucs en binaire)

Si je fais :
my $query = new CGI;
print $query->header( -type => 'application/octet-stream',
-charset => 'utf-8',
-attachment=>$filename);
print $record->as_usmarc();
et ben mon fichier il arrive daubé, et tous les caractères accentués en utf8
sont transformés en latin1

Alors que la commande :

open (FILE,">:utf8","/home/paul/Desktop/test.mrc");
print FILE $record->as_usmarc();
me donne un fichier correct.


Si quelqu'un a une piste, je cherche depuis 2H et je sèche complet...


Pour info :
Pour autant que je le sache, j'ai
AddDefaultCharset utf8
dans la config d'Apache

PS : dans les trucs en binaire, il y a notamment la position et la longueur
des trucs en clair dans le fichier. La transformation des accents de 2
octets (utf8) en 1 octet (latin1) fait que tout le reste foire dans les
grandes largeurs et que je ne peux plus décoder le fichier correctement.
(vive le XML, mais l'iso2709 est un format qui doit bien avoir ses 25
ans...)

5 réponses

Avatar
Paul Gaborit
À (at) Tue, 08 Apr 2008 17:47:12 +0200,
paul POULAIN écrivait (wrote):
J'ai un script Perl qui permet de transmettre (via apache) un fichier au
format iso2709. (C'est un format semi-binaire de bibliothécaire : des trucs
en clair et des trucs en binaire)

Si je fais :
my $query = new CGI;
print $query->header( -type => 'application/octet-stream',
-charset => 'utf-8',
-attachment=>$filename);


Ok. Donc le navigateur a l'autre bout se dira que le document est en
'utf-8' (je ne suis pas certain que cela ait une importance quelconque
pour le type 'application/octet-stream'... mais peu importe).

print $record->as_usmarc();
et ben mon fichier il arrive daubé, et tous les caractères accentués en utf8
sont transformés en latin1


Normal : la sortie standard (STDOUT) n'est certainement pas configurée
pour produire de l'UTF-8.

Alors que la commande :

open (FILE,">:utf8","/home/paul/Desktop/test.mrc");
print FILE $record->as_usmarc();
me donne un fichier correct.


Normal.


Si quelqu'un a une piste, je cherche depuis 2H et je sèche complet...


Il suffit d'indiquer à Perl que STDOUT est en UTF-8 :

binmode STDOUT, ":utf8";

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

Avatar
Nicolas George
Paul Gaborit wrote in message :
Il suffit d'indiquer à Perl que STDOUT est en UTF-8 :

binmode STDOUT, ":utf8";


Ça va faire échouer tout ce qui est transmis en données binaires.

Avatar
Paul Gaborit
À (at) 09 Apr 2008 07:52:44 GMT,
Nicolas George <nicolas$ écrivait (wrote):
Paul Gaborit wrote in message :
Il suffit d'indiquer à Perl que STDOUT est en UTF-8 :

binmode STDOUT, ":utf8";


Ça va faire échouer tout ce qui est transmis en données binaires.


Ce n'est pas à activer systématiquement : juste pour transmettre le
document en question.

L'autre possibilité, c'est de mettre STDOUT en mode 'raw' mais, dans
ce cas, il faut absolument maîtriser l'encodage de tout ce qu'on
écrit.

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


Avatar
paul POULAIN
Paul Gaborit wrote:
Il suffit d'indiquer à Perl que STDOUT est en UTF-8 :

binmode STDOUT, ":utf8";
Saint Gaborit et Saint Lhullier (sur une liste de discussion Perl) ont la

même idée... qui est la bonne.
--
Paul

Avatar
Paul Gaborit
À (at) Wed, 09 Apr 2008 16:06:55 +0200,
paul POULAIN écrivait (wrote):
Paul Gaborit wrote:
Il suffit d'indiquer à Perl que STDOUT est en UTF-8 :

binmode STDOUT, ":utf8";
Saint Gaborit et Saint Lhullier (sur une liste de discussion Perl) ont la

même idée... qui est la bonne.


Merci pour le "saint"... si c'était vrai ! ;-)

Ceci étant, la remarque de Nicolas George était tout à fait
pertinente : il ne faut pas nécessairement laisser ce réglage de
manière permanente. Surtout s'il y a d'autres informations (dans un
autre encodage) envoyées via ce script et encore plus si il doit être
utilisé via mod_perl !

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