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

xml::simple et encoding

2 réponses
Avatar
Twidi
Salut

Je suis en train de travailler (en perl) sur un outil et j'utilise xml
pour stocker les éléments en base.

Ma table (mysql) a, entre autres, deux champs : contenu_xml et
contenu_affichable

A l'appel de ma fonction d'affichage, on regarde si contenu_affichable est
vide, et si oui, on le génère a partir de contenu_xml
J'utilise pour cela XML::Simple qui répond parfaitement à mes besoins.

Cependant, j'ai un problème avec les accents... (qui n'en a pas avec XML...)

voici un exemple de contenu_xml :

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<opt>
<texte>Un test de texte accentué!</texte>
</opt>

(j'utilise l'option XMLDecl de XML::Simple pour l'encoding, comme
indiqué dans la doc)

Et après un simple appel à XMLin, j'obtiens mon hashref puis mon texte :

<<<<
my $x = new XML::Simple(ForceContent => 1, XMLDecl => '<?xml version="1.0"
encoding="ISO-8859-1" standalone="yes"?>');

my $hash = $x->XMLin($monxml);

my $texte = $hash->{'texte'}->{'content'};
>>>>

Si j'affiche le $texte directement, j'ai bien un accent...

Par contre si je le met en base dans contenu_affichable et que plus tard
je lis ce contenu_affichable..... et bien j'ai un é au lieu du é

(l'affichage est dans une page xhtml avec encoding iso-8859-1)

Si quelqu'un avait une piste... j'ai bien lu des trucs sur xmlfr.org,
mais, euh, rien qui m'inspire....

D'avance merci pour votre aide

Twidi

2 réponses

Avatar
Twidi
Bon j'ai fini par trouver...

L'enregistrement en base semble convertir d'emblée en UTF8...
ainsi un simple

use Unicode::String;
my $u = Unicode::String::utf8($texte);
$texte = $u->latin1;

Résoud le problème.

Cependant, d'après cette page :
http://xmlfr.org/documentations/articles/000508-0001

je ne devrai plus avoir besoin de ça, car, je cite
<<
Unicode::String n'est plus nécessaire en Perl 5.6, l'opérateur tr suffit:

$string=~ tr/-x{ff}//UC;




Je suis en 5.8.2 et cette ligne me sort une erreur de syntaxe...
donc bon je me contente de Unicode::String qui a résolu mon problème.

Twidi

Le Tue, 13 Jan 2004 16:36:34 +0100, Twidi a écrit :

Salut

Je suis en train de travailler (en perl) sur un outil et j'utilise xml
pour stocker les éléments en base.

Ma table (mysql) a, entre autres, deux champs : contenu_xml et
contenu_affichable

A l'appel de ma fonction d'affichage, on regarde si contenu_affichable est
vide, et si oui, on le génère a partir de contenu_xml
J'utilise pour cela XML::Simple qui répond parfaitement à mes besoins.

Cependant, j'ai un problème avec les accents... (qui n'en a pas avec XML...)

voici un exemple de contenu_xml :

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<opt>
<texte>Un test de texte accentué!</texte>
</opt>

(j'utilise l'option XMLDecl de XML::Simple pour l'encoding, comme
indiqué dans la doc)

Et après un simple appel à XMLin, j'obtiens mon hashref puis mon texte :

<<<<
my $x = new XML::Simple(ForceContent => 1, XMLDecl => '<?xml version="1.0"
encoding="ISO-8859-1" standalone="yes"?>');

my $hash = $x->XMLin($monxml);

my $texte = $hash->{'texte'}->{'content'};






Si j'affiche le $texte directement, j'ai bien un accent...

Par contre si je le met en base dans contenu_affichable et que plus tard
je lis ce contenu_affichable..... et bien j'ai un é au lieu du é

(l'affichage est dans une page xhtml avec encoding iso-8859-1)

Si quelqu'un avait une piste... j'ai bien lu des trucs sur xmlfr.org,
mais, euh, rien qui m'inspire....

D'avance merci pour votre aide

Twidi






Avatar
Jean-Michel Hiver
Par contre si je le met en base dans contenu_affichable et que plus tard
je lis ce contenu_affichable..... et bien j'ai un é au lieu du é


Ca te sors la meme chose mais encode au format unicode...

Avec Perl 5.8.x tu as le module Encode fourni en standard.
Essaie:

use Encode;
$my_unicode_var = my_unicode_var();
$my_latin_var = encode ("iso-8859-1", $my_unicode_var);


Ou alors plus simple, tu peux servir ta page HTML avec un
"Content-Type=text/html; charset=UTF-8nn"