IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

De QTextEdit � une base PostgreSQL : probl�me d'encodage [QtSql]


Sujet :

PyQt Python

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2011
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par d�faut De QTextEdit � une base PostgreSQL : probl�me d'encodage
    Bonjour � tous,

    Je produis un plugin pour QGIS, un logiciel de syst�me d'information g�ographique bas� sur Qt, dont les plugins sont �crits en Python.
    Depuis que QGIS 1.9 est dot� de sa nouvelle API (ce mois-ci), les m�thodes ".toString()" ne fonctionnent plus.
    J'utilise donc maintenant la m�thode ".toPlainText()" pour r�cup�rer les textes de deux QTextEdit (contr�les de texte sur plusieurs lignes), et les int�grer dans 2 champs d'une table PostGreSQL.

    Extrait de mon code :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    def sauverInfos(self):
            query_save = QtSql.QSqlQuery(self.db)
            query = """insert into bdtravaux.sortie (jours_chan, sortcom) values ('{zr_jours_chantier}', '{zr_sort_com}')""".format (zr_jours_chantier=self.ui.jours_chan.toPlainText().encode('UTF-8'),\
            zr_sort_com=self.ui.comm.toPlainText().encode('UTF-8'))
    Lorsque je lance cette fonction, les textes saisi par l'utilisateur sont bien int�gr�s en base. Mais, dans les champs "zr_jours_chantiers" et "zr_sort_com", les caract�res accentu�s sont remplac�s par d'autres (exemple : � => é, � => �).
    J'imagine que cela doit �tre d� au fait que toPlainText() extrait de mon objet QTextEdit une cha�ne de caract�re cod�e en ASCII, que je transforme ensuite en UTF8 avec ".encode('UTF-8')"...
    Entre temps, les caract�res sp�ciaux sont donc perdus.
    Partagez-vous cette analyse?
    Comment transformer mon QTextEdit en cha�ne de caract�res sans perdre les caract�res "sp�ciaux"?
    Enfin, je me demandais pourquoi je n'avais pas ces probl�mes d'encodage quand j'utilisais les m�thode ".toString()"...
    D'avance merci pour toute information sur ce sujet.
    Vince

    PS : je pr�cise que ma base postgresql est en UTF8, et que j'ai ajout�
    # -*- coding: utf-8 -*-
    au d�but de mon module Python.

  2. #2
    Membre �m�rite
    Homme Profil pro
    Inscrit en
    Janvier 2006
    Messages
    491
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corse (Corse)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 491
    Par d�faut
    bonjour,
    je n'utilise pas qt mais lorsque j'exporte ou importe des donn�es dans postgres je fais toujours pr�ceder ma commande sql par la ligne
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    set client_encoding to 'win1252' ;
    (dans mon exemple win1252 correspond � l'encodage de windows, il suffit de changer l'encodage par ascii si le client est en ascii)

  3. #3
    Expert confirm�
    Avatar de tyrtamos
    Homme Profil pro
    Retrait�
    Inscrit en
    D�cembre 2007
    Messages
    4 486
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par d�faut
    Bonjour,

    Je travaille surtout avec Python 2.7, PyQt4 et sqlite3. Je suppose que tu travailles aussi en Python 2.x.

    Il faudrait voir comment est configur� PostGreSQL: quel encodage doit-il recevoir? L'erreur signal�e ressemble � un encodage en "utf-8" qui n'est pas adapt�. Par exemple, avec sqlite3, on peut le configurer pour lui faire accepter soit de l'utf-8, soit de l'unicode: j'ai choisi l'unicode.

    De toute fa�on, avec Python 2.x et PyQt4, le plus facile est de travailler en unicode interne. Cela n�cessite que tout ce qui rentre est encod� unicode le plus t�t possible (.decode()), et tout ce qui sort est encod� le plus tard possible (.encode()).

    De plus travailler en interne en encodage "utf-8" sous Python 2.x est une source de bugs difficiles � d�tecter: par exemple, si x="�" est encod�e en "utf-8", len(x) sera �gal � 2 alors qu'il n'y a qu'un seul caract�re. Cette erreur n'existe pas en unicode, m�me si le "�" est aussi cod�e en 2 octets dans la m�moire de l'ordinateur.

    Attention aussi � l'affichage: quand on affiche une chaine de caract�res, elle doit �tre encod�e correctement par rapport au p�riph�rique d'affichage. Par exemple sous Windows, une chaine correcte comme "�" encod�e en "utf-8", sera affich�e comme "é" dans PyScripter, qui attend un encodage Windows ("cp1252") ou unicode.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2011
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par d�faut
    Bonjour � tous les deux et merci beaucoup pour vos r�ponses,

    Tout d'abord, je travaille effectivement sur Python 2.X. (c'est vrai que j'aurais pu le pr�ciser..)
    Les pistes que vous me sugg�rez me laissent � penser que le probl�me ne vient peut-�tre pas de mon code, mais de la configuration du serveur / de la base de donn�es / du client d'affichage.

    En effet, lorsque j'inclus un
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    "print self.ui.comm.toPlainText().encode('UTF-8')
    � la fin de ma fonction, les caract�res accentu�s s'affichent correctement dans mon terminal.

    Comme le proposait tyrtamos, j'ai donc cherch� du c�t� de l'affichage sous PGAdminIII. Je n'ai toutefois pas trouv� d'information comme quoi il ne pouvait pas afficher de l'UTF8. De plus, psql et QGIS affichent les m�mes erreurs.

    En relisant vos deux posts, j'ai eu l'id�e d'aller v�rifier dans le postgresql.conf les param�tres d'encodage. Et l�, j'ai trouv�...

    "client-encoding =sql_ascii"

    Ce pourrait-il que le probl�me vienne de l�? (que ce soit du c�t� de l'int�gration des donn�es, ou de l'affichage).

    Sinon,...
    Mon code envoie bien de l'UTF8, la base est en UTF8 (v�rification avec psql -l)... psql et PGadminIII devraient lire de l'UTF8...

    Enfin, merci tyrtamos pour le conseil de passer par de l'unicode interne. Mon formateur m'ayant conseill� l'UTF8, j'ai d�marr� mon plugin Python avec cet encodage. Je vais essayer de faire afficher correctement mes caract�res sp�ciaux en UTF8, puis je verrai comment je peux changer toute la cha�ne (j'imagine que si tout marche en UTF8, �a marchera aussi en unicode).

    En tout cas, je tenterai ce soir de passer la valeur de "client_encoding" � utf8 (si je le fais tout de suite, je vais avoir une horde d'utilisateurs f�roces sur le dos au red�marrage du serveur ).
    Je vous tiens au courant en tout cas.
    Encore merci.
    Vincent

  5. #5
    Expert confirm�
    Avatar de tyrtamos
    Homme Profil pro
    Retrait�
    Inscrit en
    D�cembre 2007
    Messages
    4 486
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Retrait�

    Informations forums :
    Inscription : D�cembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par d�faut
    Citation Envoy� par vince5962 Voir le message
    Mon formateur m'ayant conseill� l'UTF8
    Pour �tre complet, c'est bien d'encoder le SCRIPT Python en utf-8 avec une ligne comme: "# -*- coding: utf-8 -*-"! Cela ne veut pas dire que Python travaillera en utf-8, mais que les chaines lit�rales (=cod�es en 'dur') figurant dans le script seront consid�r�es comme encod�e en utf-8. Encore faut-il que ce soit vrai, c'est � dire que l'�diteur de texte ait �dit� et enregistr� le script en utf-8. Il suffit alors de faire pr�c�der le 1er guillemet de chaque chaine lit�rale par 'u', et Python transformera ces chaines de utf-8 en unicode tout seul.

    [On est toujours ici dans Python 2]

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2011
    Messages
    3
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activit� : Responsable de service informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2011
    Messages : 3
    Par d�faut
    Ah oui.
    Quand je lis ton dernier post, je me rends-compte que c'est texto ce que me disait mon formateur, mais je ne l'avais pas bien int�gr� � l'�poque.

    Et effectivement, la r�ponse �tait l� :
    Cela ne veut pas dire que Python travaillera en utf-8, mais que les chaines lit�rales (=cod�es en 'dur') figurant dans le script seront consid�r�es comme encod�e en utf-8. Encore faut-il que ce soit vrai, c'est � dire que l'�diteur de texte ait �dit� et enregistr� le script en utf-8. Il suffit alors de faire pr�c�der le 1er guillemet de chaque chaine lit�rale par 'u', et Python transformera ces chaines de utf-8 en unicode tout seul.
    Ma requ�te n'�tait visiblement pas encod�e en Unicode (s�rement en ascii), car en rajoutant u'ma requ�te ', tout est r�gl�. Je retrouve avec joie mes caract�res accentu�s dans ma base.

    La requ�te donne donc :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    query = u'INSERT INTO bdtravaux.sortie (jours_chan, sortcom) VALUES (\'{zr_jours_chantier}\', \'{zr_sort_com}\')'.format(\
            zr_jours_chantier=self.ui.jours_chan.toPlainText(),\
            zr_sort_com=self.ui.comm.toPlainText())
    Merci beaucoup!
    Bonne journ�e.
    Vince

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 2
    Dernier message: 05/03/2013, 09h46
  2. [PostgreSQL] probl�me de requ�te sur une base postgresql
    Par DiverSIG dans le forum PHP & Base de donn�es
    R�ponses: 5
    Dernier message: 01/12/2009, 08h18
  3. probl�me de connexion � une base postgresql
    Par QAYS dans le forum PostgreSQL
    R�ponses: 1
    Dernier message: 16/10/2008, 11h26
  4. [amc designer] cr�ation d'une base postgresql
    Par david42 dans le forum PostgreSQL
    R�ponses: 9
    Dernier message: 12/03/2004, 11h08
  5. Localisation d'une base Postgresql sur mdk 9.1
    Par Gregco dans le forum PostgreSQL
    R�ponses: 6
    Dernier message: 10/06/2003, 18h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo