Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1616 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Import csv - encodage défaillant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Import csv - encodage défaillant

n°2046580
jerryone3
Gamer
Posté le 05-01-2011 à 17:37:53  profilanswer
 

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. $fichier_csv = fopen( $filename, "r" );
  2. while( $contents = fgets( $fichier_csv ) )
  3. {
  4.    ...
  5. }
  6. 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. if($premier_champ =="Campaign" )
  2.     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 :
 
http://img412.imageshack.us/img412/7022/hemf.jpg
 
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 !


---------------
Si ça n'explose pas, vous ne faites pas avancer la science.
mood
Publicité
Posté le 05-01-2011 à 17:37:53  profilanswer
 

n°2046838
jerryone3
Gamer
Posté le 06-01-2011 à 12:22:21  profilanswer
 

Tenté un utf8_decode, ça aide pas !


---------------
Si ça n'explose pas, vous ne faites pas avancer la science.
n°2046866
smaragdus
whores, drugs & J.S. Bach
Posté le 06-01-2011 à 13:47:20  profilanswer
 

Vu que c'est un fichier CSV, utilise fgetcsv

n°2046895
jerryone3
Gamer
Posté le 06-01-2011 à 14:39:47  profilanswer
 

Déjà fait, ca ne change rien. Cette fonction n'est utile que pour récupérer les résultats sous une forme plus exploitable, or là il semble que c'est les résultats eux mêmes qui soient mal encodés !


---------------
Si ça n'explose pas, vous ne faites pas avancer la science.
n°2046897
stealth35
Posté le 06-01-2011 à 14:42:22  profilanswer
 

vérifie ta chaine d'encodage :
http://electron-libre.fassnet.net/utf8.php

 

tu bosses en quoi en iso ou en utf-8 ?


Message édité par stealth35 le 06-01-2011 à 14:42:43
n°2046900
gzii
court-circuit
Posté le 06-01-2011 à 14:45:01  profilanswer
 

Marrant on dirait une portion d'un .XLS.

n°2046997
jerryone3
Gamer
Posté le 06-01-2011 à 17:52:39  profilanswer
 

J'ai testé, ça n'aide pas. les 3 premiers caractères sont remplacés par un ?, c'est tout.
 
[EDIT]
 
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 :
<lien type="wikipedia" url="Marque_d'ordre_des_octets">http://fr.wikipedia.org/wiki/Marque_d%27ordre_des_octets</lien>
 
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. <?php
  2. // Unicode BOM is U+FEFF, but after encoded, it will look like this.
  3. define ('UTF32_BIG_ENDIAN_BOM'   , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
  4. define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
  5. define ('UTF16_BIG_ENDIAN_BOM'   , chr(0xFE) . chr(0xFF));
  6. define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
  7. define ('UTF8_BOM'               , chr(0xEF) . chr(0xBB) . chr(0xBF));
  8. function detect_utf_encoding($filename) {
  9.     $text = file_get_contents($filename);
  10.     $first2 = substr($text, 0, 2);
  11.     $first3 = substr($text, 0, 3);
  12.     $first4 = substr($text, 0, 3);
  13.  
  14.     if ($first3 == UTF8_BOM) return 'UTF-8';
  15.     elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
  16.     elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
  17.     elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
  18.     elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
  19. }
  20. ?>


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

Code :
  1. foreach(mb_list_encodings() as $chr){
  2.         echo mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>"; 
  3. }


 
Voila voila !


Message édité par jerryone3 le 06-01-2011 à 17:53:57

---------------
Si ça n'explose pas, vous ne faites pas avancer la science.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Import csv - encodage défaillant

 

Sujets relatifs
Recherche de specialiste en streaming et encodageconvertir \u00eb en ë (résolu, problème d'encodage/décodage)
import, traitement, conversion, opération sur fichier texte .txtimport scripts / __import__
Problème type encodage ("é","è") etc..PYTHON PHP BDD : Gros problème d'encodage
Tester l'encodage des caractèresProblème bizarre encodage caractère
[DirectShow] faire une pause dasn un graphe d'encodageImport CommonDialog + Export daté Access (Help)
Plus de sujets relatifs à : Import csv - encodage défaillant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR