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 :

import csv - encodage défaillant [Encodage]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut import csv - encodage défaillant
    Hello à tous

    Voila voila, j'essaie d'importer des données provenant d'un fichier csv généré via AdWords. Le fichier se trouve sur le serveur, et je l'ouvre donc en local dans mon php.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $fichier_csv = fopen( $filename, "r" );
    while( $contents = fgets( $fichier_csv ) )
    {
       ...
    }
    fclose( $fichier_csv );
    Le premier champ de la première ligne affiche normalement le mot "Campaign". Sur chrome et IE, ça s'affiche bien, mais si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if($premier_champ =="Campaign")
        echo "ici";
    Y'a rien qui s'affiche. Pareil en recherchant la présence d'une partie du mot avec strpos ou autres fonctions de gestion des string.

    Firefox, par contre, montre un affichage buggé. Comme ca :



    En réalité, ce n'est pas un affichage buggé, c'est le problème d'encodage qui m'empêche de traiter mes données.

    Comment faire pour formater le fichier / le champ / la ligne de telle manière que l'encodage des caractères soit normal ? J'ai tenté les fonctions "html_entity_decode" et autres, ca aide pas.

    Merci d'avance !

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Veille a ce que ton fichier csv et ton fichier php aient le meme encodage.
    Ce que tu obtiens est quand même étrange.

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Et comment je veille à ça ? ^^

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    J'ai testé avec un utf8_decode, ça aide pas non plus.

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quand je dis que le résultat est étrange c'est justement que ca ne ressemble pas a de l'utf8 ni a de l'iso mal écrit car ce serait les caractères accentués qui seraient touchés.

  6. #6
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Je suis bien d'accord, là on a l'impression que chaque caractères est bizarrement encodé. Si je vérifie la présence de "a" dans la chaine, je le trouve. Mais si je cherche "am", pas de résultat. Je ne comprends vraiment pas...

    De plus, la fonction mb_detect_encoding ne me donne pas l'encodage du string. Ca retourne vide.

    Vraiment plus d'idées moi

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2008
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 113
    Points : 73
    Points
    73
    Par défaut
    Trouvé ! Je donne la solution, au cas où quelqu'un ait le même problème, ça lui permettra de conserver les cheveux que je n'ai plus :

    Il y a un élément qui s'appelle le BOM :
    http://fr.wikipedia.org/wiki/Marque_...dre_des_octets

    Celui-ci était inclus dans mon fichier, et c'est son marquage qu'on voit au début du premier champ, les deux caractères étranges. Il existe plusieurs marquages possibles, en fonction du format du fichier, qu'une fonction trouvée sur php.net vous permet de trouver facilement :

    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
    <?php
    // Unicode BOM is U+FEFF, but after encoded, it will look like this.
    define ('UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
    define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
    define ('UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));
    define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
    define ('UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));
     
    function detect_utf_encoding($filename) {
     
        $text = file_get_contents($filename);
        $first2 = substr($text, 0, 2);
        $first3 = substr($text, 0, 3);
        $first4 = substr($text, 0, 3);
     
        if ($first3 == UTF8_BOM) return 'UTF-8';
        elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
        elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
        elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
        elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
    }
    ?>

    La solution : trouver avec quel encodage ça fonctionne bien, et utiliser mb_convert_encoding. On peut le faire facilement grâce à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach(mb_list_encodings() as $chr){
            echo mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>";   
     }
    Voila voila !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Encodage caractères spéciaux après import csv
    Par snorky94 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/10/2012, 15h27
  2. Import CSV sous Excel, garder les 0 inutile
    Par ePoX dans le forum Excel
    Réponses: 4
    Dernier message: 26/01/2009, 16h25
  3. import CSV avec encodage dans la foulée
    Par benoitXV dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 10/12/2008, 13h07
  4. import csv décimale
    Par gIch dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 13/12/2005, 12h46
  5. Importation CSV vers base de données
    Par Brice Yao dans le forum Bases de données
    Réponses: 1
    Dernier message: 29/06/2005, 13h42

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