Hello les codorz, j'aimerais ien savoir si il existe un moyen de déterminer l'encodage d'un fichier plat avec PHP, sans pour autant le parcourir de A à Z ?
Pour le moment j'ai bien cherché maiss rien de convainquant...
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
// From http://w3.org/International/questions/qa-forms-utf-8.html
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs', $string);
} // function is_utf8
Enjoy foolkz
Ton snippet ne devrait pas être trop gourmand puisqu'il se contente de tester les deux premiers caractères du fichier.hop la j'ai trouvé ça, mais bon c'ets pas parfait d'autant que si j'ai un fichier texte de 8 mo ça va faire ramer PHP !
// on force sur le charset POSIX standard (raz des locales)
setlocale ( LC_CTYPE, 'C' );
// encodage ISO 8859-1
$texte = "Les Misérables";
echo preg_match('#^.{1}#u', $texte);
// encodage UTF8
$texte = utf8_encode($texte);
echo preg_match('#^.{1}#u', $texte);
Le preg_match retournera 0 dans le premier cas et 1 dans le deuxième. As-tu essayé les suggestions faites plus haut?
Non, je viens de tester, les deux bout de code fonctionnent avec et sans BOM. J'ai mal regardé la fonction is_utf8 plus haut mais il va effectivement analyser tous les caractères du fichier et vérifier s'il s'agit de caractères ascii (autorisés dans utf8) et/ou des séquences multi-octets des caractères non ascii de cet encodage.Hmmm, ces méthodes elles ne marchent que si on a laissé (l'affreux, l'immonde, l'indicible) le BOM en début de fichier non ?
Or la plupart du temps la première chose qu'on fait quand on travaille avec l'UTF c'est de virer (cet affreux, cet immonde, cet indicible) ce BOM.