PYTHON PHP BDD : Gros problème d'encodage - Python - Programmation
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 :
|
Mais
Code :
|
De même, si on veut voir le contenu d'un tableau, alors surtout pas
Code :
|
Mais
Code :
|
Parce que le formatage "%s" cherche à convertir la chaine à ce qui est le plus représentatif
Exemple
Code :
|
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 :
|
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...
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 !!!
Marsh Posté le 19-06-2010 à 09:25:25
Cependant j'ai toujours un problème :
Code :
|
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 ?
Marsh Posté le 19-06-2010 à 10:06:44
erwan83 a écrit : |
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 :
|
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
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...
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 :
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 :
Une fois la saisie effectuée par le visiteur, je convertis
exemple :
Ensuite je saisis ces données en BdD Mysql
la table dans laquelle sont rentrées les données est en format
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 é 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