Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2011, 17h27   #1
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 78
Points : 33
Points : 33
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 :
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 :
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 !
JerryOne3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h41   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Veille a ce que ton fichier csv et ton fichier php aient le meme encodage.
Ce que tu obtiens est quand même étrange.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h42   #3
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 78
Points : 33
Points : 33
Et comment je veille à ça ? ^^
JerryOne3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 12h05   #4
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 78
Points : 33
Points : 33
J'ai testé avec un utf8_decode, ça aide pas non plus.
JerryOne3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 13h39   #5
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 14h38   #6
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 78
Points : 33
Points : 33
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
JerryOne3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 17h47   #7
Nouveau Membre du Club
 
Inscription : novembre 2008
Messages : 78
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 78
Points : 33
Points : 33
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 :
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 :
1
2
3
foreach(mb_list_encodings() as $chr){
        echo mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>";   
 }
Voila voila !
JerryOne3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h58.


 
 
 
 
Partenaires

Hébergement Web