Decodage d'entites HTML de caracte res (UTF-8?) sur PHP 4.1.2.
1 réponse
Bruno Baguette
Bonjour,
J'ai un p'tit soucis de décodage d'entités HTML de caractères qui me
semblent être de l'UTF8, avec un PHP 4.1.2. (et aucune possibilité
d'upgrade).
Je recois une chaine formée d'entités HTML (visiblement en UTF-8) :
$ToDecode = 'édfdfè dd a.pdf';
Et voici ce que je devrais normalement obtenir, après décodage :
$ResultatAttendu = 'édfdfè dd a.pdf';
Pour le moment, je n'y parviens pas. Je me sers de cette fonction :
// For users prior to PHP 4.3.0 you may do this:
function unhtmlentities($string)
{
// replace numeric entities
$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))',
$string);
$string = preg_replace('~&#([0-9]+);~e', 'chr(\\1)', $string);
// replace literal entities
$trans_tbl = get_html_translation_table(HTML_ENTITIES);
$trans_tbl = array_flip($trans_tbl);
return strtr($string, $trans_tbl);
}
Cette fonction est extraite tout droit de l'exemple 1 qui est présenté
sur http://php.belnet.be/manual/en/function.html-entity-decode.php et
l'UTF-8 est pourtant mentionné dans les encodages supportés.
Si tous les caractères non accentués sont bien décodés, il n'en est pas
de même pour les caractères accentués qui sont remplacés par des ? ou
encore des carrés.
Est-ce que vous auriez-une idée pour remédier à ce problème, si possible
proprement ?
D'avance un gros merci pour le dépannage !
--
Bruno BAGUETTE - bouchon@alussinan.org
"Nous souhaitons aider les communautés les plus pauvres de ce pays.
Que personne ne croie qu'aux Etats-Unis tout le monde vit dans
l'abondance. Ils ont des millions de pauvres là-bas"
Aout 2005 - Hugo Chavez, Président du Vénézuela.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
J'ai un p'tit soucis de décodage d'entités HTML de caractères qui me semblent être de l'UTF8, avec un PHP 4.1.2. (et aucune possibilité d'upgrade).
Je recois une chaine formée d'entités HTML (visiblement en UTF-8) : $ToDecode = 'édfdfè dd a.pdf';
Je me permets de te reprendre : les entités HTML ne sont *pas* de l'UTF-8 ; c'est juste de l'ASCII 7bits, et tu peux donc les trouver dans n'importe quel document HTML pourvu que son encodage soit compatible avec ASCII 7bits (soit par exemple ISO-8859-1 ou UTF-8 mais pas EBCDIC ni UTF-16).
Et voici ce que je devrais normalement obtenir, après décodage : $ResultatAttendu = 'édfdfè dd a.pdf';
Ok.
Pour le moment, je n'y parviens pas. Je me sers de cette fonction :
// For users prior to PHP 4.3.0 you may do this: function unhtmlentities($string) { // replace numeric entities $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("1"))', $string);
Ça ne peut pas marcher : la fonction chr() prend en entrée un nombre inférieur à 256, soit 100 hexa. C'est bon pour   et . mais pas pour ̀ ou ́.
Cette fonction est extraite tout droit de l'exemple 1 qui est présenté sur http://php.belnet.be/manual/en/function.html-entity-decode.php et l'UTF-8 est pourtant mentionné dans les encodages supportés.
... supportés par la fonction html_entity_decode, et à condition de passer celui que tu veux comme troisième paramètre ! Donc : html_entity_decode ($string, ENT_COMPAT, UTF-8)
De toute façon, ça ne résoudrait pas complètement ton problème, même si tu avais PHP 4.3.0 ou supérieur, car le « #x300; » serait bien remplacé par un accent grave, mais encore faudrait-il remplacer la séquence « e » plus « accent grave » par le caractère unique « è ».
Est-ce que vous auriez-une idée pour remédier à ce problème, si possible proprement ?
Au début de unhtmlentities, avant le 1er preg_replace : $search = array("è", "é", ...); $replace = array("è", "é", ...); $string = str_replace($search, $replace, $string);
Bien entendu, il faut compléter la liste dans $search et $replace avec toutes les combinaisons possibles de lettres et de diacritiques, en sachant que : 300 = accent grave 301 = accent aigu 302 = accent circonflexe 303 = tilde (pour ñ et Ñ) 308 = tréma
-- Olivier Miakinen Troll du plus sage chez les conviviaux : le nouveau venu, avec son clan, s'infiltre dans les groupes de nouvelles. (3 c.)
J'ai un p'tit soucis de décodage d'entités HTML de caractères qui me
semblent être de l'UTF8, avec un PHP 4.1.2. (et aucune possibilité
d'upgrade).
Je recois une chaine formée d'entités HTML (visiblement en UTF-8) :
$ToDecode = 'édfdfè dd a.pdf';
Je me permets de te reprendre : les entités HTML ne sont *pas* de
l'UTF-8 ; c'est juste de l'ASCII 7bits, et tu peux donc les trouver dans
n'importe quel document HTML pourvu que son encodage soit compatible
avec ASCII 7bits (soit par exemple ISO-8859-1 ou UTF-8 mais pas EBCDIC
ni UTF-16).
Et voici ce que je devrais normalement obtenir, après décodage :
$ResultatAttendu = 'édfdfè dd a.pdf';
Ok.
Pour le moment, je n'y parviens pas. Je me sers de cette fonction :
// For users prior to PHP 4.3.0 you may do this:
function unhtmlentities($string)
{
// replace numeric entities
$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\1"))',
$string);
Ça ne peut pas marcher : la fonction chr() prend en entrée un nombre
inférieur à 256, soit 100 hexa. C'est bon pour   et . mais
pas pour ̀ ou ́.
Cette fonction est extraite tout droit de l'exemple 1 qui est présenté
sur http://php.belnet.be/manual/en/function.html-entity-decode.php et
l'UTF-8 est pourtant mentionné dans les encodages supportés.
... supportés par la fonction html_entity_decode, et à condition de
passer celui que tu veux comme troisième paramètre !
Donc : html_entity_decode ($string, ENT_COMPAT, UTF-8)
De toute façon, ça ne résoudrait pas complètement ton problème, même si
tu avais PHP 4.3.0 ou supérieur, car le « #x300; » serait bien remplacé
par un accent grave, mais encore faudrait-il remplacer la séquence « e »
plus « accent grave » par le caractère unique « è ».
Est-ce que vous auriez-une idée pour remédier à ce problème, si possible
proprement ?
Au début de unhtmlentities, avant le 1er preg_replace :
$search = array("è", "é", ...);
$replace = array("è", "é", ...);
$string = str_replace($search, $replace, $string);
Bien entendu, il faut compléter la liste dans $search et $replace avec
toutes les combinaisons possibles de lettres et de diacritiques, en
sachant que :
300 = accent grave
301 = accent aigu
302 = accent circonflexe
303 = tilde (pour ñ et Ñ)
308 = tréma
J'ai un p'tit soucis de décodage d'entités HTML de caractères qui me semblent être de l'UTF8, avec un PHP 4.1.2. (et aucune possibilité d'upgrade).
Je recois une chaine formée d'entités HTML (visiblement en UTF-8) : $ToDecode = 'édfdfè dd a.pdf';
Je me permets de te reprendre : les entités HTML ne sont *pas* de l'UTF-8 ; c'est juste de l'ASCII 7bits, et tu peux donc les trouver dans n'importe quel document HTML pourvu que son encodage soit compatible avec ASCII 7bits (soit par exemple ISO-8859-1 ou UTF-8 mais pas EBCDIC ni UTF-16).
Et voici ce que je devrais normalement obtenir, après décodage : $ResultatAttendu = 'édfdfè dd a.pdf';
Ok.
Pour le moment, je n'y parviens pas. Je me sers de cette fonction :
// For users prior to PHP 4.3.0 you may do this: function unhtmlentities($string) { // replace numeric entities $string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("1"))', $string);
Ça ne peut pas marcher : la fonction chr() prend en entrée un nombre inférieur à 256, soit 100 hexa. C'est bon pour   et . mais pas pour ̀ ou ́.
Cette fonction est extraite tout droit de l'exemple 1 qui est présenté sur http://php.belnet.be/manual/en/function.html-entity-decode.php et l'UTF-8 est pourtant mentionné dans les encodages supportés.
... supportés par la fonction html_entity_decode, et à condition de passer celui que tu veux comme troisième paramètre ! Donc : html_entity_decode ($string, ENT_COMPAT, UTF-8)
De toute façon, ça ne résoudrait pas complètement ton problème, même si tu avais PHP 4.3.0 ou supérieur, car le « #x300; » serait bien remplacé par un accent grave, mais encore faudrait-il remplacer la séquence « e » plus « accent grave » par le caractère unique « è ».
Est-ce que vous auriez-une idée pour remédier à ce problème, si possible proprement ?
Au début de unhtmlentities, avant le 1er preg_replace : $search = array("è", "é", ...); $replace = array("è", "é", ...); $string = str_replace($search, $replace, $string);
Bien entendu, il faut compléter la liste dans $search et $replace avec toutes les combinaisons possibles de lettres et de diacritiques, en sachant que : 300 = accent grave 301 = accent aigu 302 = accent circonflexe 303 = tilde (pour ñ et Ñ) 308 = tréma