Page 1 sur 1
Problème d'accents à la lecture d'un fichier texte en php
Posté : 30 déc. 2008, 16:32
par eloreal
Bonjour à tous,
Voici mon problème:
Sur mon site, je permets l'import de fichiers vcard, texte ou csv, comprenant des noms et prénoms, vers ma base de données. J'utilise PHP et une base mysql.
La base de données est en utf-8 (c'est un besoin car les fichiers importés peuvent être dans toutes les langues)
Lorsque j'importe des fichiers encodés en UTF-8, aucun problème.
Lorsque j'importe un fichier texte tout simple, fait dans notepad, les accents ne passent pas.
Pour lire mon fichier j'utilise la fonction file_get_contents.
J'ai essayé d'utiliser mb_detect_encoding et mb_convert_encoding pour toujours transformer l'encodage du texte qui ne serait pas en UTF-8 vers l'UTF-8, mais apparemment cela ne passe pas.
Existe-t'il une bonne façon de faire pour lire un fichier texte dans son encodage et transformer ensuite le contenu en UTF-8???
Merci de votre aide, j'ai passé des jours dessus sans trouver de solution, malgré tout un tas de tests.
Salutations.
Emmanuel
Posté : 30 déc. 2008, 16:44
par Victor BRITO
En plus des fonctions de l'extension mbstring, as-tu essayé iconv() ?
iconv et mb_convert_encoding
Posté : 30 déc. 2008, 17:04
par eloreal
Hello,
Oui malheureusement, j'ai essayé et:
mb_convert_encoding($content, 'UTF-8',$mon_encodage);
et
iconv($mon_encodage,'UTF-8',$content);
avec le même mauvais résultat.
Pour info, je récupère $content et $mon_encodage de la façon suivante:
$content = file_get_contents($fn); // ou fn est mon nom de fichier
$mon_encodage = mb_detect_encoding($content.'a',"ASCII, UTF-8, ISO-8859-1, KOI8-R", true); // .'a'
pour éviter le bug php
Auriez vous d'autres suggestions?
Re: iconv et mb_convert_encoding
Posté : 30 déc. 2008, 17:12
par Victor BRITO
$mon_encodage = mb_detect_encoding($content.'a',"ASCII, UTF-8, ISO-8859-1, KOI8-R", true); // .'a' pour éviter le bug php
Soit dit en passant, tu peux te contenter de ça :
$mon_encodage = mb_detect_encoding($content);
As-tu vérifié ce que retournait exactement la variable $mon_encodage ?
Valeur de retour de mb_detect_encoding
Posté : 30 déc. 2008, 17:27
par eloreal
Re,
Oui quand j'affiche le retour de mb_detect_encoding j'obtiens ISO-8859-1. Qui est à priori bien l'encodage de mon fichier texte généré par notepad.
Mes caractères sont bien affichés sur ma page web, mais mal insérés dans la base.
Et si je récupère l'encodage seulement avec mb_detect_encoding($content); là j'obtiens UTF-8, et à ce moment là mes caractères disparaissent carrément de l'écran, et ne sont pas insérés dans la base!

Posté : 30 déc. 2008, 17:29
par Victor BRITO
As-tu pensé à la requête SQL suivante :
?

Posté : 30 déc. 2008, 17:52
par eloreal
Je ne connais pas cette requête, comment fonctionne-t'elle? ou faut elle la mettre? juste avant un insert??
Posté : 30 déc. 2008, 17:58
par Victor BRITO
Je ne connais pas cette requête, comment fonctionne-t'elle? ou faut elle la mettre? juste avant un insert??
La lecture du
manuel de MySQL ne fait jamais de mal :
SET NAMES indique ce qui est dans la commande SQL que le client envoie. Par conséquent, SET NAMES cp1251 indique au serveur : ``les futurs messages fournis par ce client seront dans le jeu de caractères cp1251'' et le serveur est libre de les traduire dans son propre jeu de caractères, éventuellement.
Par conséquent, mieux vaut l'exécuter avant une insertion de données.
Posté : 30 déc. 2008, 21:02
par eloreal
Merci, j'ai essayé, mais il fallait le faire dès le début, mes bases sont déjà pleines de données, et avec cette requete, les infos dans la base sont différentes, et donc si je le fais maintenant, je récupèrerais mal toutes les anciennes.... mais c'est certainement très bien à utiliser!
Pour le moment, je reste avec mb_convert_encoding($content, 'UTF-8',$mon_encodage);
il y a juste quelques caractères qui ne fonctionnent pas, et je ne sais pas pourquoi... peut etre des réglages au niveaux du serveur apache/php/mysql ???
a+
Posté : 30 déc. 2008, 22:30
par jojolapine
Pour y voir un epu plus clair:
http://www.phpfrance.com/forums/voir_sujet-245062.php
Tu seras obligé d'utilsier SET NAMES UTF-8 pour tes enregistrements si tu veux que tes données aient un tant soit peu de cohérences...
ALlez un peu de courage, tu reprends sur de bonnes bases, et c'est partit!