[Perl] Problème avec module Archive::Zip et UTF-8

Olivier Mengué olivier.mengue at gmail.com
Jeu 11 Mai 02:54:59 CEST 2017


Le 10 mai 2017 à 17:43, Dominique Asselineau <asseline at telecom-paristech.fr>
a écrit :

>
> Si j'ajoute dans l'archive zip un membre à partir d'une chaîne UTF-8
> avec la méthode addString( $chaine, $nomDeMembre ), lorsqu'ensuite je
> tente d'écrire cette archive à l'aide de la méthode writeToFileHandle,
> dans un fichier temporaire produit par Archive::Zip::tempFile(),
> j'obtiens l'erreur
>
> Wide character in Compress::Raw::Zlib::crc32 at
> /usr/share/perl5/Archive/Zip.pm line 307.
>
> Comme indiqué dans le man de Archive::Zip, à la section "Archive::Zip
> Global Variables", je positionne la variable "local
> $Archive::Zip::UNICODE = 1;" juste avant l'appel à la méthode
> addString mais ça ne convient pas.
>
> Je suppose que la variable $Archive::Zip::UNICODE = 1; devrait
> permettre à addString d'encoder la chaîne Perl UTF-8 en octets qui ne
> devraient pas poser problème lors de traitement suivant ?
>
>
Pas du tout.

La doc indique : « This variable governs how Unicode file and directory
names are added to or extracted from an archive. »

Or le problème que tu rencontre n'est pas sur les noms de fichiers mais sur
le *contenu* de ces fichiers.
Tu ne dois pas envoyer une chaîne Unicode comme contenu mais plutôt une
chaîne d'octets (bytes) que tu aura proprement encodés à partir d'un chaîne
Unicode. Utilise pour cela le module Encode.

  use Encode 'encode';
  $zip->addString( encode('UTF-8', $string1), 'la-1re-chaine.txt' );

Ton code corrigé est en pièce jointe.

Olivier.
-------------- section suivante --------------
Une pièce jointe HTML a été nettoyée...
URL: <http://listes.mongueurs.net/mailman/private/perl/attachments/20170511/fb21d376/attachment.html>
-------------- section suivante --------------
Une pièce jointe autre que texte a été nettoyée...
Nom: zipTemporary-corrigé.pl
Type: application/x-perl
Taille: 986 octets
Desc: non disponible
URL: <http://listes.mongueurs.net/mailman/private/perl/attachments/20170511/fb21d376/attachment.bin>


Plus d'informations sur la liste de diffusion Perl