PHP: mb_internal_encoding - Manual
Je pensais avoir partagé ici, mais visiblement non :o
Si vous êtes en UTF-8 dans PHP, utilisez ça pour tronquer du texte :
mb_internal_encoding('UTF-8');
$tronque = mb_substr($complet, 0, 60);
au lieu de :
$tronque = substr($complet, 0, 60);
Le UTF8 enregistre des caractères sur plusieurs octets. Si vous utilisez substr(), il arrive qu’il coupe au milieu d’un caractère (entre deux octets d’un même caractère), produisant un « � » dans le code source.
Ceci produit un bug quand on essaye de parser le code qui n’en est plus valide.
Avec mb_internal_encoding() on configure PHP pour que le moteur de substr() soit en UTF8, et qu’il ne coupe plus entre deux octets d’un même caractère multi-bit (mb).
L’erreur est reproductible avec <?php echo substr('é', 0, 1); ?> : le E accent aigu est sur deux octets et on lui dit de couper à un octet : ça coince.
L’UTF8 c’est cool, mais à condition d’utiliser ça de A à Z, sinon ça merde à tous les niveaux imaginables… Et encore une fois, si les navigateurs masquent l’erreur à l’internaute qui n’y voit que du feu, en tant que programmeur ce n’est que quand on s’amuse un peu (à wget() une simple page web mal fichue, ici) qu’on se casse lamentablement les dents et qu’on cherche durant des heures…
Si vous êtes en UTF-8 dans PHP, utilisez ça pour tronquer du texte :
mb_internal_encoding('UTF-8');
$tronque = mb_substr($complet, 0, 60);
au lieu de :
$tronque = substr($complet, 0, 60);
Le UTF8 enregistre des caractères sur plusieurs octets. Si vous utilisez substr(), il arrive qu’il coupe au milieu d’un caractère (entre deux octets d’un même caractère), produisant un « � » dans le code source.
Ceci produit un bug quand on essaye de parser le code qui n’en est plus valide.
Avec mb_internal_encoding() on configure PHP pour que le moteur de substr() soit en UTF8, et qu’il ne coupe plus entre deux octets d’un même caractère multi-bit (mb).
L’erreur est reproductible avec <?php echo substr('é', 0, 1); ?> : le E accent aigu est sur deux octets et on lui dit de couper à un octet : ça coince.
L’UTF8 c’est cool, mais à condition d’utiliser ça de A à Z, sinon ça merde à tous les niveaux imaginables… Et encore une fois, si les navigateurs masquent l’erreur à l’internaute qui n’y voit que du feu, en tant que programmeur ce n’est que quand on s’amuse un peu (à wget() une simple page web mal fichue, ici) qu’on se casse lamentablement les dents et qu’on cherche durant des heures…