convertir un array en utf8

dans un précédent article nous avons vu comment convertir un texte en utf8.

aujourd’hui on va voir comment faire la même chose mais avec un tableau, sans passer par un foreach, ni aucune autre boucle.

pour cela nous allons utiliser une seule fonction qui convertira ce qu’on lui donne en entrée en utf8.
pour l’instant elle va savoir gérer, les chaînes de caractères et les tableaux.

function toUTF8($param)
{
    if(is_array($param)) {
        array_walk_recursive($param, create_function('&$item, $index', '$item = toUTF8($item);'));
        return $param;
    }
 
    mb_detect_order('UTF-8, ISO-8859-15, ISO-8859-1, Windows-1252');
    //parfois si le dernier caractère de la chaine est accentué, la conversion peut foirer,
    //donc on force avec un caractère qui ne l'est pas.
    //(astuce trouvée sur les commentaires de la doc sur php.net)
    $param .= '_';
    $currentCharset = mb_detect_encoding($param);
 
    if ($currentCharset != 'UTF-8') {
        $param = mb_convert_encoding($param, 'UTF-8', $currentCharset);
    }
 
    return substr($param, 0, strlen($param)-1);
}

et voilà, cette fonction convertira array ou string en utf8 sans brancher…

en bonus voici une fonction somme que j’ai trouvé dans les commentaire de la doc sur php.net (une sorte de coup de coeur pour moi :-D)

function sum(){
    $s=0;
    foreach(func_get_args() as $a) $s+= is_numeric($a)?$a:0;
    return $s;
};
 
print sum(1,2,3,4,5,6); // will return 21
print sum(3,2,1); // will return 6
print sum(false,array(),5,5); // will return 10

trop fort non ?

Share

3 Comments

  1. le $param .= ‘_’; est mal placé. Si tu passes une chaine de caractère en paramètres et que son encodage est utf8 alors tu auras cette même chaine de caractère avec un ‘_’ en plus :-)

    Cdt,

    Mohamed

    Répondre

  2. J’ai trouver cette fonction dans le manuel php qui fonctionne mieux dans le cas ou l’on veux encoder en json (elle ne convertie pas les nombre) donc 1 reste 1 et non « 1 ».
    function utf8_encode_deep(&$input) {
    if (is_string($input)) {
    $input = utf8_encode($input);
    } else if (is_array($input)) {
    foreach ($input as &$value) {
    utf8_encode_deep($value);
    }

    unset($value);
    } else if (is_object($input)) {
    $vars = array_keys(get_object_vars($input));

    foreach ($vars as $var) {
    utf8_encode_deep($input->$var);
    }
    }
    }

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *