PYTHON PHP BDD : Gros problème d'encodage

PYTHON PHP BDD : Gros problème d'encodage - Python - Programmation

Marsh Posté le 18-06-2010 à 11:28:22    

Bonjour !
 
Je suis sur un projet de moteur de recherche...
Dans un premier temps j'ai le "crawler" qui contient l'entête suivant :

Code :
  1. #!/usr/bin/env python
  2. # coding: UTF-8 -*-


là déjà je me prends la tête car je n'arrive pas à faire des conversions d'encodage mais je bidouille...
Dans un deuxième temps, la page html du "moteur" (Vavavavroummm)
j'ai le tag suivant :

Code :
  1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">


Une fois la saisie effectuée par le visiteur, je convertis
exemple :

Code :
  1. $input = str_replace("&eacute;","e",$input);//é
  2. etc etc etc


Ensuite je saisis ces données en BdD Mysql
la table dans laquelle sont rentrées les données est en format  

Code :
  1. latin1_general_ci


 
Alors le problème que j'ai : les accents.....
A chaque fois que je ressorts un enregistrement de la BdD sur ma page, ça me colle un caractère débile (sorte de losange)
 
Donc la question :
 
Comment faire ?
Dois-je appliquer un replace pour chaque éèùô etc exemple remplacer é par &eacute; avant de rentrer les résultats dans la BdD ?
 
Merci !


Message édité par erwan83 le 18-06-2010 à 17:25:19

---------------
http://www.ypikay.com
Reply

Marsh Posté le 18-06-2010 à 11:28:22   

Reply

Marsh Posté le 18-06-2010 à 19:25:11    

Le pb de l'encodage c'est une grosse merde quand on est seul. On sait pas trop où on en est.
 
Déjà, première chose: quand on fait du debug et qu'on veut afficher une variable string, on fait pas

Code :
  1. print variable


Mais

Code :
  1. print "%s" % variable


 
De même, si on veut voir le contenu d'un tableau, alors surtout pas

Code :
  1. print tableau


 
Mais

Code :
  1. for x in tableau: print "%s" % x


 
Parce que le formatage "%s" cherche à convertir la chaine à ce qui est le plus représentatif
Exemple

Code :
  1. tableau=("ééé",)
  2. print tableau
  3. for x in tableau: print "%s" % x


Le premier print traitant un tableau affichera le code ascii des "é" alors que le second print traitant une chaine convertira le code en vrais caractères. J'ai galéré longtemps avant de comprendre ça.
 
De plus, afficher aussi type(var) peut être pas mal. Car si la variable est codée en string pure, ce sera "type str" alors que si elle est codée en unicode, ce sera "type unicode".

Code :
  1. for x in tableau: print "[%s] %s" % (x, type(x))


 
On arrive au type unicode. là, je te recommande d'aller lire cette page http://pythonfacile.free.fr/python/unicode.html qui m'a bien servi.
J'en ai conclu que pour avoir un truc souple, il valait mieux stocker en interne en type unicode. Pour ça, t'as une fonction
si ta chaine est ascii pur => string=unicode(string, "latin1" )
si ta chaine est utf-8 => string=unicode(string, "utf-8" )
Au final, ta chaine sera de type unicode (code universel)
 
Ensuite, si tu veux la convertir en ascii => string.encode("latin1" )
Et si tu veux la convertir en utf-8  => string.encode("utf-8" )
 
Il existe aussi une fonction string.decode("utf-8" ) => ça te décode une chaine de type utf-8 pour la convertir en string classique. Et idem avec string.decode("latin-1" )
 
J'espère qu'avec ça, tu arriveras à t'en sortir. Concernant la bdd MySQL de type latin-1, là je peux pas t'aider. je sais pas comment MySQL gère ses trucs. Mais si tu veux une bdd costaud, je te conseillerais plutôt PostgreSQL. Pas forcément pour l'encodage mais plus pour ce qui est de la gestion des index ou des foreign-keys sur champs composés...


Message édité par Sve@r le 18-06-2010 à 19:29:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-06-2010 à 09:18:03    

fichtre !
Merci de ta réponse en tout cas !
Je vais voir ça...
Plus qu'un petit soucis d'indexation et c'est parti
(j'ai compté plus de 400 000 phrases indexées)
La gueule de la routine de tri... 24 heures de boulot environ !!!


---------------
http://www.ypikay.com
Reply

Marsh Posté le 19-06-2010 à 09:25:25    

Cependant j'ai toujours un problème :
 

Code :
  1. #!/usr/bin/env python
  2. # coding: UTF-8 -*-
  3. import sys
  4. import os
  5. import httplib
  6. import urllib2
  7. import urllib
  8. import datetime


 
si je veux changer d'encodage en tête de programme (#coding) Python m'envoie bouler !
cela est-il en rapport avec les modules importés ?


---------------
http://www.ypikay.com
Reply

Marsh Posté le 19-06-2010 à 10:06:44    

erwan83 a écrit :


Plus qu'un petit soucis d'indexation et c'est parti
(j'ai compté plus de 400 000 phrases indexées)
La gueule de la routine de tri... 24 heures de boulot environ !!!


Pourquoi tu fais faire ça par Python ? Tu vas éclater ton système !!!
Laisse faire ça par le moteur bdd. Il a été fait pour ça. Evidemment question puissance, MySQL (version free) est un peu à la ramasse devant PostgreSQL mais ça c'est toi qui voit...
 

erwan83 a écrit :

Cependant j'ai toujours un problème :
 

Code :
  1. #!/usr/bin/env python
  2. # coding: UTF-8 -*-
  3. import sys
  4. import os
  5. import httplib
  6. import urllib2
  7. import urllib
  8. import datetime


 
si je veux changer d'encodage en tête de programme (#coding) Python m'envoie bouler !
cela est-il en rapport avec les modules importés ?


Quel encodage cherches-tu ? latin-1 ? Non, ça n'a aucun rapport avec les modules.
J'ai pas encore bien compris l'utilité de cette ligne. Apparemment elle permet à Python de lire ton code s'il contient des strings codées en utf-8 mais c'est encore un peu flou. Donc si ton code contient des strings utf-8 et que tu écris coding latin-1, il boulera. Enfin je crois.
Par ailleurs j'ai vu qu'il fallait l'écrire # -*- coding ... -*- (mais il semble que Python 2.5 et au-delà accepte l'écriture sans "-*-" )
 
Une super doc ici: http://sebsauvage.net/python/charsets_et_encoding.html


Message édité par Sve@r le 19-06-2010 à 10:10:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-06-2010 à 10:35:03    

ça doit venir des morceaux de textes en UTF8 qui sont dans le prog
j'explique : la BdD ne fait que stocker les requetes, histoire de bien énerver Google (Gniarkkk)
Par contre, toutes les phrases et mots sont stockés directement sous forme de fichiers texte et c'est pour cela que c'est long à indexer...
actuellement les propriétés me retournent... ... ... pfff c'est long ;) y'en a plus que je ne pensais ... ... ... 627381 fichiers répartis dans 312 dossiers, indexés sur 240 index Pfoulala...


---------------
http://www.ypikay.com
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed