OVH Cloud OVH Cloud

caractere pas commun avec UTF-8 pour XML

32 réponses
Avatar
Seb
Bonjour,

Je galère depuis quelques jours sur un problème, et j'ai rien trouvé
d'intéressant sur Google que se soit sur le web ou dans les newsgroups.

Je génère un fichier XML encodé en utf-8, pour encoder les textes rentrées
j'y vais à coup de utf8_encode(htmlspecialchars($texte)) pour être conforme
à la fois à XML et au paramètre d'entrée de utf8_encode (utf8_encode
convertit de iso-8859-1 en utf-8).

Jusque là pas de problème avec la grande majorités des caractères
(&<>éèà...) mais je me suis aperçu : qu'avec celui-ci par exemple : right
single quote mark 92 &#146; &rsquo; --> '
Ni htmlspecialchars ou htmlentities et ni utf8_encode l'encode du coup je me
retrouve avec un document XML non valide !

J'aimerais savoir qu'elle est la meilleur stratégie à adopter à votre avis,
pour l'instant je fais un str_replace mais la solution me convient pas car
j'imagine que le problème peu se reposer avec d'autre caractère. Qu'elles
sont les caractères à problème et existe t-il une solution propre pour y
remédier ?

PS : v. PHP 4.3.2

D'avance un grand merci pour votre aide,

Séb

-- carpe diem --
Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne
savait pas et qu'il l'a fait. Marcel Pagnol.

10 réponses

1 2 3 4
Avatar
Etienne SOBOLE
Ce qui me surprend, c'est que tu aies besoin de coder en utf-8
spécifiquement les caractères windows.

Je suppose que ta page, si elle contient un euro microsoft, doit
contenir aussi au moins un e avec accent aigu ou un a avec accent grave.
Donc, si tu dois traduire toi-même le 80 (¤ win-1252) en E2 82 AC (¤
utf-8), alors tu dois aussi traduire le E9 (é iso-8859-1 ou win-1252) en
C3 A9 (é utf-8). Me trompé-je ?


Tu as tout a fait raison.
j'ai fait un client mail et le blème c'est lorsque je recois un mail qui
provient de outlook que j'ai quelques soucis.

pour etre franc je sais encore pas trop comment je vais faire,
parce que je ne peux par remplacer les caractères avant l'encodage UTF-8.
ni apres d'ailleurs.

donc la solution est de ce faire sa propre routine de conversion UTF-8.
ou de trouver quelques chose qui convertierai correctement

ici
http://www.php.net/manual/fr/function.utf8-encode.php
si tu cherches "code2utf",
tu trouveras une contrib d'un gars qui a écrit une fonction qui convertit en
utf-8.

donc oui, pour répondre a ta question. va falloir que j'ecrive une fonction
win-1252 => utf-8
qui sera identique a iso-8859-1 => utf-8
sauf si tu as mieux a me proposer...

voila
Etienne

Avatar
Olivier Miakinen

J'ai essayé avec "Windows-1252" ou avec "CP1252" :
utf8_encode(iconv("Windows-1252", "ISO-8859-1", htmlspecialchars($txt))).


La transformation d'un caractère spécifique à Windows-1252 n'a aucune
chance de fonctionner si tu essayes de l'encoder dans un charset qui ne
le contient pas (ISO-8859-1, par exemple).

Essaye :
iconv("cp1252", "UTF-8", htmlspecialchars($txt))

Mon rêve aurait été de faire un : iconv(mb_http_input(), "UTF-8",
htmlspecialchars($txt))


Oui, ce serait l'idéal.

Comment faire pour encoder de manière "automatique" en utf-8 un
questionnaire par un utilisateur quelque soit le charset qu'il utilise ?


La première chose, c'est de savoir *vraiment* ce que tu récupères. Fais
des essais avec une boucle qui t'affiche ord($carac) pour chaque
caractère de la chaîne, avec des exemples simples (un "é" ou un "¤").

Avatar
Seb

J'ai essayé avec "Windows-1252" ou avec "CP1252" :
utf8_encode(iconv("Windows-1252", "ISO-8859-1",
htmlspecialchars($txt))).



La transformation d'un caractère spécifique à Windows-1252 n'a aucune
chance de fonctionner si tu essayes de l'encoder dans un charset qui ne
le contient pas (ISO-8859-1, par exemple).


Oui, effectivement, c'est la moindre des choses mais je l'oublie !!

Essaye :
iconv("cp1252", "UTF-8", htmlspecialchars($txt))


:) oui merci ça marche :)

Mon rêve aurait été de faire un : iconv(mb_http_input(), "UTF-8",
htmlspecialchars($txt))


Oui, ce serait l'idéal.

Comment faire pour encoder de manière "automatique" en utf-8 un
questionnaire par un utilisateur quelque soit le charset qu'il utilise ?


La première chose, c'est de savoir *vraiment* ce que tu récupères. Fais
des essais avec une boucle qui t'affiche ord($carac) pour chaque
caractère de la chaîne, avec des exemples simples (un "é" ou un "¤").


D'accord merci, j'ai fais quelques tests je vois la démarche :)

Je te remercie très sincèrement pour toutes des explications, ça ma bien
aiguiller ;)

Séb


Avatar
loufoque
Etienne SOBOLE wrote:
sauf si tu as mieux a me proposer...
iconv.


Avatar
loufoque
Seb wrote:

Mon rêve aurait été de faire un : iconv(mb_http_input(), "UTF-8",
htmlspecialchars($txt))
Malheureusement le fonctionnement de mb_http_input() semble assez peu
fiable.


Il suffit de demander au navigateur d'envoyer les données en UTF-8
directement, ce serait plus simple non ?

Avatar
Etienne SOBOLE
"loufoque" a écrit dans le message de news:
c8fh86$p4s$
iconv.


et bien il me semblait avoir essayé cette methode, mais me rappelait pas
qu'elle marchat.
je vais rester...

Etienne

Avatar
Etienne SOBOLE
"loufoque" a écrit dans le message de news:
c8fh86$p4s$
iconv.


ouaip c'est vrai que ca marche.
c'est vrai qu'a l'epoque ou j'avais testé, j'avais pas compris qu'on pouvait
recevoir des mail avec un encodage ISO-8859-1 alors qu'en fait c'est un
Windows-1252...

arf...
tout ce temps perdu...

Avatar
Seb
Il suffit de demander au navigateur d'envoyer les données en UTF-8
directement, ce serait plus simple non ?


Comment fais tu pour demander au navigateur depuis une requête serveur qu'il
te renvoie les données automatiquement en UTF-8 ? En plus même si c'était
faisable rien n'empêche l'utilisateur de changer l'encodage à la main !

Séb

Avatar
Bobe
Seb nous a dit le 19/05/2004 22:19:
Il suffit de demander au navigateur d'envoyer les données en UTF-8
directement, ce serait plus simple non ?


Comment fais tu pour demander au navigateur depuis une requête serveur qu'il
te renvoie les données automatiquement en UTF-8 ?


Soit la page elle même est en UTF-8 et dans ce cas, le navigateur devrait
envoyer les données encodées en UTF-8, soit tu indiques l'encodage dans lequel
le navigateur doit envoyer les données.
Par exemple, pour un formulaire html:

<form method="post" action="http://example.org/Script" accept-charset="UTF-8">

Mais cette solution est à éviter pour l'instant car peu de navigateurs
tiennent compte de l'attribut accept-charset.

En plus même si c'était
faisable rien n'empêche l'utilisateur de changer l'encodage à la main !



Cela modifierait l'encodage en ce qui concerne ce qui est affiché mais peut
être pas en ce qui concerne les données envoyées. Faudrait tester...

Sinon, peut être que le navigateur précise l'encodage des données dans le
champs content-type mais j'ai des doutes.

--
Bobe (Aurélien Maille)
http://webnaute.net

"la vie d'un geek est un combat perpétuel contre l'imperfection"


Avatar
Bobe
J.J.SOLARI nous a dit le 16/05/2004 23:07:


Le problème résidait (plutôt, réside toujours) principalement, comme il
me semble que c'est ton cas, dans l'incompatibilité entre les jeux de
caractères win-1252 (et d'autres win-xxxx) avec iso-8859-1.

Je m'en étais sorti en mappant chacun des caractères du jeu cp-1252
situés dans la zone réservée (selon iso-8859-1) par leur équivalent
Unicode. Voici ce que ça donnait :



Quelle était la provenance des données ?

Car dans le cas d'un formulaire html par exemple, et si le charset de la page
est ISO-8859-1, le navigateur devrait théoriquement envoyer les données sous
le charset ISO-8859-1 non ?

--
Bobe (Aurélien Maille)
http://webnaute.net

"la vie d'un geek est un combat perpétuel contre l'imperfection"

1 2 3 4