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

Unicode

5 réponses
Avatar
Kloug
Bonjour,
Je transforme une chaine UTF-8 [=C3=A9]
avec le module Unicode::Transform
$string =3D utf8_to_unicode($string)
Dans le navigateur elle s'affiche [=E9] correctement.
Si je l'ins=E8re dans une base MySql en Latin1=20
(pas moyen de changer ceci) je retrouve
le caract=E8re encod=E9 en UTF-8 [=C3=A9]
Ou est l'erreur ?
Merci d'avance pour tout conseil.
K

5 réponses

Avatar
Nicolas George
"Kloug" wrote in message <4742bdc5$0$27377$:
Je transforme une chaine UTF-8 [é]
avec le module Unicode::Transform
$string = utf8_to_unicode($string)


Pourquoi utiliser ce module plutôt que les modules natifs de Perl ?
Personnellement, j'ai souvent des doutes sur la bonne gestion de l'Unicode
natif de Perl par les modules tiers, même ceux dont c'est la fonction
principale.

Avatar
Paul Gaborit
À (at) Tue, 20 Nov 2007 11:57:59 +0100,
"Kloug" écrivait (wrote):
Je transforme une chaine UTF-8 [é]
avec le module Unicode::Transform
$string = utf8_to_unicode($string)
Dans le navigateur elle s'affiche [é] correctement.
Si je l'insère dans une base MySql en Latin1
(pas moyen de changer ceci) je retrouve
le caractère encodé en UTF-8 [é]
Ou est l'erreur ?


L'erreur est (me semble-t-il) de croire qu'on a besoin de
Unicode::Transform ! ;-)

La bonne question à se poser est : d'où vient cette chaîne ?

Si elle est lue dans un fichier, il suffit de lire le fichier
correctement via les encoding.

Si elle est directement dans le source, il faut placer un "use utf8;"
au début du code.

Comme ça, en interne, la chaîne sera correctement gérée par Perl.

Ensuite, reste à savoir comment la ressortir avec le bon encodage.

La doc de DBD::mysql ne le dit pas explicitement mais à moins
d'ajouter l'option 'mysql_enable_utf8', je pense que le codage par
défaut est Latin1. Donc... Il n'y a rien à faire.


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

Avatar
Kloug
L'erreur est (me semble-t-il) de croire qu'on a besoin de
Unicode::Transform ! ;-)


En fait je traite des mails lus dans
le fichier /var/mail/comptepop
Si la balise Content-Transfer-Encoding:
du corps est à UTF-8, je transforme en Latin1
cette partie.
A l'affichage dans le navigateur c'est ok mais à l'insertion dans MySql,
du contenu affiché, damned, je retrouve l'UTF-8 initial.

J'ai résolu provisoirement en redécodant le contenu MySql à
la lecture mais mon but est d'avoir une base homogène.
Merci de toutes pistes.
K

Avatar
Nicolas George
"Kloug" wrote in message <47443ff7$0$27369$:
En fait je traite des mails lus dans
le fichier /var/mail/comptepop
Si la balise Content-Transfer-Encoding:


Tu aurais tout intérêt à utiliser une bibliothèque de décodage MIME complète
déjà faite : il y a des subtilités dans la gestion qui sont pénibles à
réimplémenter.

du corps est à UTF-8, je transforme en Latin1


Mais tu ne peux pas être sûr que ça passe : UTF-8 est strictement plus gros
que latin-1. Il vaudrait largement mieux stocker le texte sous un format
permettant de représenter Unicode en entier.

Avatar
Paul Gaborit
À (at) 21 Nov 2007 14:56:34 GMT,
Nicolas George <nicolas$ écrivait (wrote):
"Kloug" wrote in message <47443ff7$0$27369$:
En fait je traite des mails lus dans
le fichier /var/mail/comptepop
Si la balise Content-Transfer-Encoding:


Tu aurais tout intérêt à utiliser une bibliothèque de décodage MIME complète
déjà faite : il y a des subtilités dans la gestion qui sont pénibles à
réimplémenter.


Tout à fait d'accord.

du corps est à UTF-8, je transforme en Latin1



Là, il y a un problème puisque la conversion peut échouer. Que faire
dans ce cas ? Si le mail (ou une partie du mail) est en UTF8, c'est
sûrement utile (ne serait-ce que pour un e-dans-l'o ou un symbole euro
en restant en français). C'est donc impossible à faire sans perte et
j'imagine que ce n'est pas le but de perdre de l'information...

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