Encodage ? omfg

Eléphanteau du PHP | 10 Messages

04 août 2007, 20:47

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...

ViPHP
ViPHP | 1380 Messages

05 août 2007, 15:03

C'est toujours un exercice devinatoire et approximatif mais, si tu as installé le module multi-byte ou compilé PHP avec l'option multi-byte, regarde du côté de mb_detect_encoding().

Sinon (sous Linux),
exec('file tomFichieraTester');
ripat

Eléphanteau du PHP | 10 Messages

05 août 2007, 16:04

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 !
// 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

ViPHP
ViPHP | 5924 Messages

05 août 2007, 16:07


ViPHP
ViPHP | 5924 Messages

05 août 2007, 16:12

Sinon, pour empêcher le dépassement de RAM, tu peux analyser le fichier par tranches de plusieurs kilooctets.

ViPHP
ViPHP | 1380 Messages

06 août 2007, 13:59

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 !
Ton snippet ne devrait pas être trop gourmand puisqu'il se contente de tester les deux premiers caractères du fichier.

Autre solution du même genre:

Il suffit souvent de tester le nombre de bytes du premier caractère du fichier. Mais, comme toutes les méthodes de validation UTF8, il y a des lacunes. On utilise pour ça l'option PCRE u (minuscule).

A essayer dans ton cas:
// 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?
ripat

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

06 août 2007, 15:35

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.

ViPHP
ViPHP | 1380 Messages

07 août 2007, 10:44

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.
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.

Mon bout de code sera alors plus rapide. L'option PCRE u semble se comporter comme suit, si un caractère multi-octet est rencontré dans le scan de la chaîne, il considérera chaque caractère comme un mutli-octet. Même les ascii mono octet.

Mais pourquoi ne pas utiliser mb_detect_encoding() ?
ripat

steveoriol
Invité n'ayant pas de compte PHPfrance

13 sept. 2007, 15:51

Pensez vous que l'on puisse utiliser que la première ligne d'un fichier avec mb_detect_encoding() ? :?: