Import csv - encodage défaillant
Résolu
jerryone3
Messages postés
55
Date d'inscription
Statut
Membre
Dernière intervention
-
jerryone3 Messages postés 55 Date d'inscription Statut Membre Dernière intervention -
jerryone3 Messages postés 55 Date d'inscription Statut Membre Dernière intervention -
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.
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 :
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 !
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.
$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 :
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 :
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 !
A voir également:
- Import csv - encodage défaillant
- Encodage ascii - Guide
- Ntdll.dll défaillant - Forum Windows 8 / 8.1
- Convertir csv en ofx - Forum Excel
- Import favoris chrome - Guide
- Comment savoir quel composant de mon ordinateur est défaillant - Guide
4 réponses
tu n'as pas compris ce que je disais.
alors procède différemment:
remplace:
par:
alors procède différemment:
remplace:
if($premier_champ =="Campaign") echo "ici";
par:
if(utf8_encode($premier_champ) =="Campaign") echo "ici";
J'ai très bien compris ce que tu disais, et je l'avais fait. C'était pas ça, mais merci quand même pour ton aide. En attendant...
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 type="php">
<?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';
}
?>
</code>
La solution : trouver avec quel encodage ça fonctionne bien, et utiliser mb_convert_encoding. On peut le faire facilement grâce à ceci :
<code type="php">
foreach(mb_list_encodings() as $chr){
echo mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>";
}
</code>
Voila voila !
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 type="php">
<?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';
}
?>
</code>
La solution : trouver avec quel encodage ça fonctionne bien, et utiliser mb_convert_encoding. On peut le faire facilement grâce à ceci :
<code type="php">
foreach(mb_list_encodings() as $chr){
echo mb_convert_encoding($text, 'UTF-8', $chr)." : ".$chr."<br>";
}
</code>
Voila voila !