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

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
Eric Daspet
Seb wrote:
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 !


Es tu sûr qu'il s'agit bien d'un caractère ISO-8859-1 et pas un des
caractères spéciaux MS Windows qui sont en fait du cp1252 ?
Auquel cas il faut faire une fonction spécifique pour gérer ces quelques
caractères. Je sais que Olivier Meunier a fait et travaillé une telle
fonction de conversion pour son outil de blog. Tu peux fouiller sur
http://www.neokraft.net et http://www.dotclear.net il doit y avoir un
endroit où il en parle sur un des deux (et le cas échéant prendre le
code de la version de développement et regarder où il faut ce genre de
transfo).

--
Eric Daspet
Venez aider notre mangeur de cigogne sur http://mangeur-de-cigogne.info/

Avatar
Etienne SOBOLE
"Seb" a écrit dans le message de news:
40a2c112$0$17918$

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 !


Salut.
bon ben c'est complètement exacte ce que tu dis :)
tout les caractère 0x9? ne sont pas traduisible en UTF-8.
pourquoi je sais pas, mais je crois que c'est en grande partie due au fait
que la charset source est un charset windows.

bref.
moi je fais un str_replace parce que 'ai j'ai rien trouvé de mieux a faire.
j'ai egalement des probleme avec le ? qui parfois n'est pas converti.

bref. si par hasard tu trouves la solution idéale, hésite pas a le dire.

Etienne

Avatar
John Gallet
Bonjour,

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


Pour vérification : même en jouant avec ENT_QUOTES etc... ?

JG

Avatar
Olivier Miakinen

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 !


C'est normal, puisque &#146; n'existe pas. Le « right single quote
mark » est U+2019, soit &#8217; en décimal. Seul windows-1252 a ce
caractère à la position 146.

Tu peux mettre à la poubelle tous tes signets vers des pages web
prétendant le contraire. Une recherche via google m'en a trouvé des
tas. La plupart appelle d'ailleurs « ASCII » des caractères dont le
numéro est supérieur à 127, ce qui est une autre hérésie.

Avatar
Olivier Miakinen

Bonjour,

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


Pour vérification : même en jouant avec ENT_QUOTES etc... ?


Aucune chance, à mon avis.

En revanche, si le caractère est mis en dur (un seul octet de valeur
146, au lieu des six octets /&/#/1/4/6/;/), alors la fonction iconv avec
'CP1252' comme code d'entrée devrait fonctionner.
<http://fr2.php.net/manual/fr/ref.iconv.php>


Avatar
Seb


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 !


C'est normal, puisque &#146; n'existe pas. Le « right single quote
mark » est U+2019, soit &#8217; en décimal. Seul windows-1252 a ce
caractère à la position 146.



Merci :), ça m'a aidé.

Tu peux mettre à la poubelle tous tes signets vers des pages web
prétendant le contraire. Une recherche via google m'en a trouvé des
tas.


Oui, il y en a un bon nombre !!


Séb


Avatar
Seb
Seb wrote:
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 !


Es tu sûr qu'il s'agit bien d'un caractère ISO-8859-1 et pas un des
caractères spéciaux MS Windows qui sont en fait du cp1252 ?
Auquel cas il faut faire une fonction spécifique pour gérer ces quelques
caractères. Je sais que Olivier Meunier a fait et travaillé une telle
fonction de conversion pour son outil de blog. Tu peux fouiller sur
http://www.neokraft.net et http://www.dotclear.net il doit y avoir un
endroit où il en parle sur un des deux (et le cas échéant prendre le
code de la version de développement et regarder où il faut ce genre de
transfo).



php tiré de la class.wiki2whtml.php
# Copyright (c) 2004 Olivier Meunier and contributors. All rights reserved

[...]
# Correction des caractères faits par certains traitement
# de texte comme Word
if ($this->getOpt('active_fix_word_entities')) {
$wR = array(
',' => '&#8218;',
'f' => '&#402;',
'"' => '&#8222;',
'.' => '&#8230;',
'?' => '&#8224;',
'?' => '&#8225;',
'^' => '&#710;',
'?' => '&#8240;',
'S' => '&#352;',
'<' => '&#8249;',
'O' => '&#338;',
''' => '&#8216;',
''' => '&#8217;',
'"' => '&#8220;',
'"' => '&#8221;',
'.' => '&#8226;',
'-' => '&#8211;',
'-' => '&#8212;',
'~' => '&#732;',
'T' => '&#8482;',
's' => '&#353;',
'>' => '&#8250;',
'o' => '&#339;',
'Y' => '&#376;',
'?' => '&#8364;');

$res = str_replace(array_keys($wR),array_values($wR),$res);
}
[...]

Merci, ça me donne une liste des caractères à problème, mais je ne crois pas
qu'elle soit complète à moins que j'ai loupé quelque chose.

Séb


Avatar
Olivier Miakinen


php tiré de la class.wiki2whtml.php
# Copyright (c) 2004 Olivier Meunier and contributors. All rights reserved

[...]
# Correction des caractères faits par certains traitement
# de texte comme Word
if ($this->getOpt('active_fix_word_entities')) {
$wR = array(
',' => '&#8218;',
'f' => '&#402;',
[...]
'Y' => '&#376;',
'?' => '&#8364;');

$res = str_replace(array_keys($wR),array_values($wR),$res);
}
[...]

Merci, ça me donne une liste des caractères à problème, mais je ne crois pas
qu'elle soit complète à moins que j'ai loupé quelque chose.


J'ai compté 25 lignes dans cet exemple, alors qu'il y a 27 caractères
non grisés dans les lignes 80 et 90 de la page qui suit :
http://www.microsoft.com/globaldev/reference/sbcs/1252.htm

Je suppose donc qu'il manque 2 traductions. Mais je ne peux pas te dire
lesquelles vu que, par définition, on ne peut pas les transmettre sur
usenet sans utiliser le codage propriétaire Microsoft ou utf-8, tous
deux interdits dans ce groupe.

Regarde quand même le bas de la page que je viens de citer. Elle
contient des lignes telles que celles-ci :

80 = U+20AC : EURO SIGN
82 = U+201A : SINGLE LOW-9 QUOTATION MARK
83 = U+0192 : LATIN SMALL LETTER F WITH HOOK
etc.

Il suffit de traduire les nombres en décimal pour avoir les bons codes.
Par exemple U+20AC = &#8364; pour l'euro (tiens, il fait partie des 2
qui manquent), U+201A = &#8218; (le premier de ta liste), U+0192 &#402; (le second de ta liste), etc.

Avatar
Seb
"Seb" a écrit dans le message de news:
40a2c112$0$17918$

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 !


bon ben c'est complètement exacte ce que tu dis :)
tout les caractère 0x9? ne sont pas traduisible en UTF-8.
pourquoi je sais pas, mais je crois que c'est en grande partie due au fait
que la charset source est un charset windows.


C'est possible en php avec une expression régulière de remplacer tout les
0x9?, je vois pas comment faire ?

moi je fais un str_replace parce que 'ai j'ai rien trouvé de mieux a
faire.

j'ai egalement des probleme avec le ? qui parfois n'est pas converti.

bref. si par hasard tu trouves la solution idéale, hésite pas a le dire.


J'hésiterais pas, mais je la cherche encore ;)

@+
Séb


Avatar
Seb
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


Pour vérification : même en jouant avec ENT_QUOTES etc... ?


Aucune chance, à mon avis.

En revanche, si le caractère est mis en dur (un seul octet de valeur
146, au lieu des six octets /&/#/1/4/6/;/), alors la fonction iconv avec
'CP1252' comme code d'entrée devrait fonctionner.
<http://fr2.php.net/manual/fr/ref.iconv.php>


Merci, je ne connaissais pas cette lib, je vais l'essayer.
Si je comprend bien, ce qu'il mieux faire, c'est de trouver qu'elle est
l'encodage dans lequel l'utilisateur a rempli le formulaire puis convertir
dans un encodage unique (type utf-8) pour avoir quelque chose de propre ?

Séb
(pour les médiateurs : enlevés SVP -antispam pour me répondre , merci)



1 2 3 4