Acceuilphp, js(378) Gérer de l'UTF8 sans tenir compte de l'encodage du navigateur
Gérer de l'UTF8 sans tenir compte de l'encodage du navigateur
2010-11-09
Deux fonctions qui permettent écrire de l'arabe, du chinois, du russe...
sans se
soucier de savoir si l'utilisateur a forcé le codage ou laissé le choix "codage auto" dans le navigateur.
/**
* utf8entities
*
* Pour améliorer l'htmlentities() pour les chaînes en UTF-8 !
*
* Transforme une chaîne UTF8 en entitées HTML & # nnn; n={0..9} visible
* dans tous les navigateurs.
* @param string $source Encoded using UTF-8
* @return string String of unicode entities
* @see
http://www.php.net/utf8_decode
* @see http://www.randomchaos.com/document.php?source=php_and_unicode
*/
function utf8entities($str)
{
if (!is_string($str)) die('Warning: '
.'utf8entities(string $source) : $source should be a string.');
/**
*
Retourne true si la string ou l'array de string est encodé en UTF8.
*
* Exemple
d'utilisation. Vous voulez afficher un fichier texte sans vous soucier
* de son encodage (UTF-8 ou 8-bit).
* $array = file('fichier.txt');
* $isUTF8 = isUTF8($array);
* foreach($array as $val)
* {
* echo $isUTF8?utf8entities($val)
* :htmlentities($val);
* }
* @param mixed A string, or an array from a file() function.
* @return boolean
* @author iubito
*/
function isUTF8($string)
{
if (is_array($string))
{
$enc =
implode('', $string);
return @!((ord($enc[0]) != 239) && (ord($enc[1]) != 187) && (ord($enc[2]) != 191));
}
else
{
return (utf8_encode(utf8_decode($string)) == $string);
}
}
Ma fonction utf8entities ne transforme pas les & en &. Ainsi si on passe "é" ou
"é" ça imprime "é" à l'écran. Mais c'est vrai que ça peut être un bug vu que ça se comporte pas exactement comme
htmlentities. Il en va de même pour < et >. Donc si on veut exactement le même comportement qu'htmlentities, il faut
modifier la ligne (vers la fin du code)
$entities .= $value<128 ? chr($value) : (''.$value.';');
en
$entities .= $value<128 ? htmlentities(chr($value)) : (''.$value.';');