IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

PHP et UTF-8


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Mai 2003
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2003
    Messages : 271
    Points : 720
    Points
    720
    Par défaut PHP et UTF-8
    Je suis en train de me prendre la tête sur un pb d encoding UTF-8.
    Je génère un fichier txt qui doit être en utf-8 à partir d une classe php (et des donnés mysql).
    mbstring est actif sur php 5.2

    D'un côté (A), j exporte les données pour tagger des fichiers référencés dans ma base. De l autre (B), je veux exporter les même données pour tagger des fichiers que je liste à partir d un répertoire et dont les fichiers sont enregistrés dans une array().

    Dans le cas A, l'export des données fonctionne correctement en utf-8.
    Si j'active B, mon fichier txt n est plus utf8.

    le coeur du code pour A est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $exifCmdN = $exifCmd." ".$image_path;
    $writeOK = fwrite($fp, $exifCmdN) !== FALSE;
    Pour B, dans la même méthode, je veux exporter quasiment la meme ligne, sauf que le chemin vers le fichier diffère.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (array_key_exists($key, $this->original_pict_array))
    {	
    	$src_image_path = realpath($this->original_pict_array[$key]);
    	if (file_exists($src_image_path)) 
    	{ 
    	    $exifCmdN2 = $exifCmd." ".$src_image_path.$this->eol;
    	    $writeOK = fwrite($fp, utf8_encode($exifCmdN2)) !== FALSE;
    	}
    }
    J'ai sur B forcé le utf8_encode ds le fwrite*. J'ai alors en sortie par ex ceci d'exporté:
    exiftool -IPTC:CodedCharacterSet=UTF8 -IPTC:Headline="cathédrale" E:\localhost\piwigo-2.0.2\galleries\Autriche\Salzburg\72_cathedrale_int.jpg
    exiftool -IPTC:CodedCharacterSet=UTF8 -IPTC:Headline="cathédrale" E:\CD-Photos\2002-2007_DVD1-5\DVD1_copy\Autriche_2002_Ascension (9-12 mai)\72_cathedrale_int.jpg
    La 1ere ligne représente A, la 2nd B.
    D'où vient mon pb? Comme vous voyez ds le code, exifCmdN et exifCmdN2 sont quasi identiques, mais générent une string différente (exifCmdN reste en utf-8 alors que exifCmdN2 passe en iso8859). Pourquoi?

    Une piste d explication est la clef $key de mon array qui est qque part décodée puis réencodée en utf-8, mais je ne vois pas en quoi cela peut influer le reste, puisque j'utilise realpath pour le chemin et la même base $exifCmd ds les 2 cas (ds l exemple, $exifCmd vaut << exiftool -IPTC:CodedCharacterSet=UTF8 -IPTC:Headline="cathédrale" >>)

    *mes tests confirment ce qui est annoncé ici. Le utf8_encode doit être ds le fwrite, si il est avant, cela ne fonctionne pas!
    Si je l'omet, le fichier complet est en ansi au lieu d etre utf8 (et avec des é partout).

    Et puis cette page référence les fonctions à risque. C'est quoi ce langage où les fonctions de bases de gestion des strings peuvent endommager les dites strings?

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    C'est quoi ce langage où les fonctions de bases de gestion des strings peuvent endommager les dites strings?
    euf oui c'est php sa.. C'est plus une question historique qu'un choix des dévelo, amha.

    bref.

    *mes tests confirment ce qui est annoncé ici. Le utf8_encode doit être ds le fwrite, si il est avant, cela ne fonctionne pas!
    Si je l'omet, le fichier complet est en ansi au lieu d etre utf8 (et avec des é partout).
    Super bizarre, mais bon c'est php hein (Au bout de la troisième j'arrête)


    Sinon en passant, un petit bout de code qui moi m'a bien aidé qd j'avais des problèmes avec utf-8.

    Surement pas parfait, mais suffisant pour mon usage et mes clients.

    a plus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    class MyString{
     
        public static function detect_line_endings($Contents) {
            if(false !== strpos($Contents, "\r\n")) return "\r\n";
            elseif(false !== strpos($Contents, "\r")) return "\r";
            else return "\n";
        }
     
     
     
        public static function is_utf8($Contents) {
            if( function_exists("mb_detect_encoding") ){
                $retour = mb_detect_encoding($Contents,'UTF-8, ISO-8859-1')=="UTF-8";
            }else{
                $retour = self::test_utf8($Contents);
            }
            return $retour;
        }
     
        protected static function test_utf8($str) {
            $c=0; $b=0;
            $bits=0;
            $len=strlen($str);
            for($i=0; $i<$len; $i++){
                $c=ord($str[$i]);
                if($c > 128){
                    if(($c >= 254)) return false;
                    elseif($c >= 252) $bits=6;
                    elseif($c >= 248) $bits=5;
                    elseif($c >= 240) $bits=4;
                    elseif($c >= 224) $bits=3;
                    elseif($c >= 192) $bits=2;
                    else return false;
                    if(($i+$bits) > $len) return false;
                    while($bits > 1){
                        $i++;
                        $b=ord($str[$i]);
                        if($b < 128 || $b > 191) return false;
                        $bits--;
                    }
                }
            }
            return true;
        }
    }
    Hope this helps, hth.

  3. #3
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Problème locasse effectivement. Je ne sais pas si ça va résoudre ton problème, mais assure toi que tes fichiers de scripts php soient en utf8.
    Ensuite, essai d'enlever tes utf8_encode() pour B si ça fonctionne bien sans ça pour la partie A et que ce sont les mêmes données

Discussions similaires

  1. [PHP 5.0] PHP et UTF-8
    Par Shushugo dans le forum Langage
    Réponses: 6
    Dernier message: 20/03/2014, 17h02
  2. Flux RSS avec PHP : encodage UTF-8 vers ISO-8559-1
    Par eric437 dans le forum Langage
    Réponses: 1
    Dernier message: 03/08/2008, 20h56
  3. [MySQL] Pb formulaire PHP et UTF-8
    Par fguigui dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/05/2006, 19h22
  4. [PHP] <?xml version="1.0" encoding="UTF-16
    Par pierrot10 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 06/03/2006, 11h22
  5. [XML] Php -> XML / Utf-8
    Par gehan dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 09/02/2006, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo