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

Decodage d'entites HTML de caracte res (UTF-8?) sur PHP 4.1.2.

1 réponse
Avatar
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.

1 réponse

Avatar
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

Source : http://hapax.iquebec.com/Tableaux-4.1/U0300.pdf

--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)