Logo
Depuis 1998

Gestion du signe euro dans utf8_encode

Qui n’a jamais eu à faire à ce petit caractère incongru en losange au milieu d’un mot sur une page web ?
Pire encore, sur sa page web !
Que veut-il exprimer ? Il s’agit d’un caractère non-reconnu par l’encoding utf8.
Certains petits malins utiliseront utf8_encode, mais l’euro ne passera pas…
Cet article s’adresse à un public qui possede des notions de webmastering, et notamment qui ait été en contact avec la notion de header HTML et d’encodage de caractere. Si ces notions vous sont étrangeres, veuillez vous documentez sur Internet sur ces points précis.

Typiquement pour le cas qui nous intéresse, ce petit caractère losangique c’est de l’ISO-8859-1 exprimé utf8. Ce qui veut dire en décodé que le header de la page web en question est utf8 :, donc le navigateur s’attend à voir arriver les caractères spéciaux codés sur plus d’un octet (comme ce e accent aigu), mais il voit subitement arriver un octet, qui est la forme ISO-8859-1 du e accent aigu. Or, à cette valeur-là ce correspond aucun caractère utf8, donc il affiche son“not found” par défaut, soit ce losange.

Ce problème est typiquement trouvé dans les pages codées en UTF8 qui rassemblent du contenu issu de plusieurs sources encodée pour certaines en UTF8 et pour certaines en ISO-8859-1. Ici par exemple, les titres d’images arrivent en ISO-8859-1. Il y a hétérogénéité des codages.

Comment corriger ce problème ?

La réponse courte
La réponse courte est d’utiliser la fonction utf8_encode() pour coder en utf8 au sein de votre page web les textes susceptibles de contenir des caractères non-standards. Ainsi le navigateur qui reçoit ce texte, et pour peu que votre page web lui impose un charset=UTF-8, rendra ces caractères proprement.

Si votre langage de script est le PHP, je vous conseille même d’utiliser un alias que vous pourrez définir vous-même dans votre bibliothèque de fonctions : la fonction de mon cru utf8_encode2(), de code défini ci-après. Elle a l’immense avantage de coder certains caractères ignorés par utf8_encode(), car faisant partie d’autres jeux de caractères. En l’occurence cp1252, qui inclut l’euro.


<?php
function utf8_encode2($str) {

    
$final_str $str;

    
$final_str str_replace('œ''&#339;',  $final_str);
    
$final_str str_replace('’''&#2019;'$final_str);
    
$final_str str_replace('“''&#201C;'$final_str);
    
$final_str str_replace('”''&#201D;'$final_str);
    
$final_str str_replace('…''&#2026;'$final_str);
    
$final_str str_replace('€''&#8364;'$final_str);

    
$final_str utf8_encode($final_str);

    
$final_str str_replace(utf8_encode('&#339;') , 'Å“',     $final_str);
    
$final_str str_replace(utf8_encode('&#2019;'), '’'$final_str);
    
$final_str str_replace(utf8_encode('&#201C;'), '“'$final_str);
    
$final_str str_replace(utf8_encode('&#2026;'), '…'$final_str);
    
$final_str str_replace(utf8_encode('&#201D;'), '”'$final_str);
    
$final_str str_replace(utf8_encode('&#8364;'), '€'$final_str);

    return 
$final_str;
}
?>


La réponse longue
Et avec laquelle vous n’aurez même pas besoin d’utiliser utf8_encode() pour transmettre votre texte dans le flux HTML, ni autres htmlentities() etc… Il s’agit de suivre la best practice d’enregistrer vos pages web en format utf8. Il faudra vous assurer que votre header HTML de la page à afficher indique le charset utf8, comme vu sur l’image 2 plus haut.
De cette manière vous pourrez vous permettre toutes les fantaisies, euro, caractères les plus tordus, et tout collera, même sur les navigateurs made in China.

Alors si utf8 résoud tout, pourquoi utiliser les fonctions de conversion ?
Première bonne raison de les utiliser c’est justement pour convertir des données en UTF8 dans le cadre d’une migration.
Deuxième raison, c’est pour résoudre des cas de sources mixtes, alors que le développeur n’aurait pas l’entier contrôle du code ou du codage des données. Il doit jongler avec ce qu’il a. D’où l’intérêt qu’il ait à sa disposition une bibliothèque de fonctions de conversion.
(12863 vues)
créé le 12 septembre 2011
révisé le 10 février 2017 par
Accepteriez-vous notre politique de confidentialité ? Elle parle de cookies et de données personnelles...