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

Python Discussion :

Utf-8 et Ascii


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut Utf-8 et Ascii
    Bonjour, (et bonne année !)

    J'écris actuellement un bout de code en Python 2.6 (sous Linux) et j'ai un problème d'UTF-8.

    En fait, mon programme lit un fichier TXT avec csv.reader puis parcours les lignes et génère une requête INSERT qui doit être exécutée sur une base MS Sql (2008).

    Jusque là, rien d'extraordinaire !
    Le problème c'est que dans mon fichier, il y a des noms en Allemand (donc avec des ü et quelques trucs encore plus exotiques), donc au moment ou je crée ma requête, j'ai un méchant message qui me dit :
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 9: ordinal not in range(128)

    Quelqu'un connaît-il une solution ?

    Merci d'avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edblv Voir le message
    Quelqu'un connaît-il une solution ?
    Oui mais il faudrait plus de précisions
    1) comment est codé le fichier que tu lis
    2) quel est le codage de ta base Sql

    Mais on va admettre que ton fichier allemand est encodé en utf8 et que la ligne lue est stockée dans une variable "lig". Et que ta bdd est codée en latin
    Ben il faudra que tu fasses un insert de lig.decode("utf-8").encode("latin-1")
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui mais il faudrait plus de précisions
    1) comment est codé le fichier que tu lis
    2) quel est le codage de ta base Sql

    Mais on va admettre que ton fichier allemand est encodé en utf8 et que la ligne lue est stockée dans une variable "lig". Et que ta bdd est codée en latin
    Ben il faudra que tu fasses un insert de lig.decode("utf-8").encode("latin-1")
    Mon fichier TXT est en ASCII pur et dur, il est lu dans un programme en Python dans lequel j'ai indiqué # -*- coding: utf-8 -*-
    Je l'ouvre avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    NoFic = open(self.Repertoire+"/"+self.FichierCourant,'r')
    ReaderCSV= csv.reader(NoFic,delimiter='\t')
    self.TblFicCSV=list(ReaderCSV)
    ...et un peu plus loin, je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    for IndCol in range(len(self.TblCorresp)) :
    	if LstChamps!="":
    		LstChamps+=", "
    		LstValues+=", "
     
    	NoColFic=self.TblCorresp[IndCol]["NOCOL"]
    	LstChamps+=self.TblCorresp[IndCol]["NOMCHAMP"]
    	LstValues+=self.TblFicCSV[NoLigne][NoColFic].decode("utf-8").encode("latin-1")
     
    	Requete="INSERT INTO dbo."+self.NomTable+" ("+LstChamps+") VALUES ("+LstValues+")"
     
    	cur = self.CnxBase.cursor()
    	cur.execute(Requete)
    	self.CnxBase.commit()
    Et ça passe pas !
    Sur la ligne ou je fais la concaténation (LstValues+=self.TblFicCSV[NoLigne][NoColFic].decode("utf-8").encode("latin-1") ) j'ai un message d'erreur.

  4. #4
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par edblv Voir le message
    dans mon fichier, il y a des noms en Allemand (donc avec des ü et quelques trucs encore plus exotiques)
    Citation Envoyé par edblv Voir le message
    Mon fichier TXT est en ASCII pur et dur
    Ne trouves-tu pas ces 2 affirmations un peu contradictoires?

    A+

    Pfeuh

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Pour préciser mon problème (qui ne déchaîne pas les foules...)

    Dans mon fichier TXT il y a ce texte : Josef-Schüttler -Str 17

    Si je demande à Python de me l'afficher, il m'affiche ça :
    Josef-Sch\xfcttler -Str 17

    Si je fait type(MaVariable), il me réponds :
    <type 'str'>

    Comment puis-je obtenir une variable dans laquelle il y aura :
    "INSERT INTO Adresse (Rue1) VALUES ('Josef-Schüttler -Str 17')"

    La requête DOIT être construite dynamiquement à partir des champs que je trouve dans le fichier TXT.

    J'espère avoir été plus clair.
    Je fais ce genre de chose tout les jours en PHP mais je n'y arrive pas en Python

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edblv Voir le message
    Pour préciser mon problème (qui ne déchaîne pas les foules...)

    Dans mon fichier TXT il y a ce texte : Josef-Schüttler -Str 17

    Si je demande à Python de me l'afficher, il m'affiche ça :
    Josef-Sch\xfcttler -Str 17
    Hum, là déjà il convient de vérifier une chose. Pour afficher, utilises-tu l'ordre
    >>> MaVariable
    ou bien
    >>> print MaVariable
    Parce que le résultat n'est pas le même...

    Citation Envoyé par edblv Voir le message
    Si je fait type(MaVariable), il me réponds :
    <type 'str'>

    Comment puis-je obtenir une variable dans laquelle il y aura :
    "INSERT INTO Adresse (Rue1) VALUES ('Josef-Schüttler -Str 17')"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    order="INSERT INTO Adresse (Rue1) VALUES ('%s')" % MaVariable
    print order
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Alors, j'ai essayé ça pour voir
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    order="INSERT INTO Adresse (Rue1) VALUES ('%s')" % MaVariable
    print order

    Et ça semble fonctionner.

    Donc comment faire maintenant pour générer dynamiquement ma requête en fonction des colonnes qui sont dans le fichier (c'est mon tableau TblCorresp du début) ?

  8. #8
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edblv Voir le message
    Donc comment faire maintenant pour générer dynamiquement ma requête en fonction des colonnes qui sont dans le fichier (c'est mon tableau TblCorresp du début) ?
    Alors là, ma poupougne, cela devient ton boulot. Tu récupères tes colonnes, tu fais une boucle, tu génère ta requête item par item. Bref c'est purement de l'algo quoi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Alors là, ma poupougne, cela devient ton boulot. Tu récupères tes colonnes, tu fais une boucle, tu génère ta requête item par item. Bref c'est purement de l'algo quoi...
    Non mais pour l'algorythme, je maitrîse !!!
    Mon problème, c'est la syntaxe Python ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Es-ce qu'on peut faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    order="INSERT INTO Adresse (Champ1, Champ2, Champ3) VALUES (%d, %d, '%s')" % MonTableau
    ... c'est possible ça ?

    Parce que, quand je lis un fichier JE NE SAIS PAS combien de colonnes il y a dedans !

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par edblv Voir le message
    Es-ce qu'on peut faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    order="INSERT INTO Adresse (Champ1, Champ2, Champ3) VALUES (%d, %d, '%s')" % MonTableau
    ... c'est possible ça ?

    Parce que, quand je lis un fichier JE NE SAIS PAS combien de colonnes il y a dedans !
    Eh ben non, c'est pas possible, j'ai testé pour vous, maintenant, je suis à sec, si quelqu'un pouvait m'aider, ce serait sympa.

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Bon, alors, je me réponds tout seul (dans l'espace, personne ne vous entend crier).

    J'ai donc une boucle qui me génère une variable dans ce genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Requete="INSERT INTO Adresse (IDFOURNISSEUR, VILLE, IDADRESSE, PAYS, ESCO, ENCOUR, NOREG, NOECH, TVADEF, NOM, RUE1, DEP, IDETVA, TELEPHONE1, TELEPHONE3, NOLIBTEL1, DEVISE, CODPOS, DOMICI, ETABLI, GUICHE, COMPTE, CLERIB, TARIF, CONDPO, COMMENT, CREATIONLE, MODIFLE, TELEPHONE2, NOLIBTEL2, NOLIBTEL3, RUE2, RUE3) VALUES ({IDFOURNISSEUR}, '{VILLE}', {IDADRESSE}, '{PAYS}', {ESCO}, {ENCOUR}, {NOREG}, {NOECH}, {TVADEF}, '{NOM}', '{RUE1}', '{DEP}', '{IDETVA}', '{TELEPHONE1}', '{TELEPHONE3}', {NOLIBTEL1}, '{DEVISE}', '{CODPOS}', '{DOMICI}', '{ETABLI}', '{GUICHE}', '{COMPTE}', '{CLERIB}', '{TARIF}', '{CONDPO}', '{COMMENT}', '{CREATIONLE}', '{MODIFLE}', '{TELEPHONE2}', {NOLIBTEL2}, {NOLIBTEL3}, '{RUE2}', '{RUE3}')"
    ... et puis un tableau associatif du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TblValues["IDFOURNISSEUR"]=1
    TblValues["VILLE"]="Bouzieux le haut"
    ....
    etc
    et finalement je fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cur = self.CnxBase.cursor()
    cur.execute(Requete.format(**TblValues))
    Et ça marche !!!
    ... sauf pour mon adresse allemande avec des ü dedans

    Il doit bien y avoir une solution, j'aime bien cette façon de faire et à mon avis c'est la meilleur mais j'ai toujours un problème d'UTF-8

    HEEEEEEEEEELP

  13. #13
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par edblv Voir le message
    dans l'espace, personne ne vous entend crier
    Isaac... C'est toi? Vivement le 28 janvier!

    En fait, on n'a pas de données suffisantes pour te répondre, Il faudrait un programme allégé (ne contenant que la reproduction du bug) que l'on pourrait tester sur notre machine et reproduisant simplement le problème. Si j'ai bien compris, tu as 2 problèmes:
    1 - La fabrication d'une chaine/requête à partir d'un dictionnaire labels/valeurs
    2 - le problème d'encodage/décodage.

    Tu confirmes?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python
    # -*- coding: latin-1 -*-
    import Tkinter
    dico = {'integer':12, 'float':12.45, 'string':u'"Straße"'}
    labels = dico.keys()
    values = [unicode(dico[key]) for key in dico.keys()]
    order = u"INSERT INTO Adresse (%s) VALUES (%s)"%(', '.join(labels), ', '.join(values))
    root = Tkinter.Tk()
    Tkinter.Label(root, text=order).grid()
    root.mainloop()
    Ceci te donnera peut-être une idée pour avancer. Chez moi, je ne peux pas afficher order dans la console c'est pour cela que je l'affiche graphiquement. Tu remarqueras que dico n'est pas trié, mais que les couples label/valeur sont respectés.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Isaac... C'est toi? Vivement le 28 janvier!

    En fait, on n'a pas de données suffisantes pour te répondre, Il faudrait un programme allégé (ne contenant que la reproduction du bug) que l'on pourrait tester sur notre machine et reproduisant simplement le problème. Si j'ai bien compris, tu as 2 problèmes:
    1 - La fabrication d'une chaine/requête à partir d'un dictionnaire labels/valeurs
    2 - le problème d'encodage/décodage.

    Tu confirmes?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/python
    # -*- coding: latin-1 -*-
    import Tkinter
    dico = {'integer':12, 'float':12.45, 'string':u'"Straße"'}
    labels = dico.keys()
    values = [unicode(dico[key]) for key in dico.keys()]
    order = u"INSERT INTO Adresse (%s) VALUES (%s)"%(', '.join(labels), ', '.join(values))
    root = Tkinter.Tk()
    Tkinter.Label(root, text=order).grid()
    root.mainloop()
    Ceci te donnera peut-être une idée pour avancer. Chez moi, je ne peux pas afficher order dans la console c'est pour cela que je l'affiche graphiquement. Tu remarqueras que dico n'est pas trié, mais que les couples label/valeur sont respectés.
    Tiens ça m'a l'air pas mal ce bout de code, je vais l'essayer, merci.

    En fait ça va être dur d'envoyer mon code parce c'est plusieurs méthode qui s'appellent.
    Il y en une qui ouvre le fichier TXT, une qui analyse le contenu de la première ligne (avec les noms des champs) et qui fait la correspondance avec les champs de la table SQL, une autre qui parcours le fichier et une qui génère la requête !!!

    Mais mon problème est bien celui que tu expose :
    J'ai un fichier avec des données (utf-8 ou latin-1) et je doit générer des requêtes SQL dynamiques pour alimenter ma base.
    La solution que j'ai trouvé pour le moment fonctionne bien avec du latin-1 mais pas avec de l'utf-8.

    J'eesaye ton code et je reviens...

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Bon, je progresse doucement.
    Finalement j'ai conservé mon code, celui qui fait :

    1° une chaîne avec la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Requete="INSERT INTO Adresse (IDFOURNISSEUR, VILLE, IDADRESSE, PAYS, ESCO, ENCOUR, NOREG, NOECH, TVADEF, NOM, RUE1, DEP, IDETVA, TELEPHONE1, TELEPHONE3, NOLIBTEL1, DEVISE, CODPOS, DOMICI, ETABLI, GUICHE, COMPTE, CLERIB, TARIF, CONDPO, COMMENT, CREATIONLE, MODIFLE, TELEPHONE2, NOLIBTEL2, NOLIBTEL3, RUE2, RUE3) VALUES ({IDFOURNISSEUR}, '{VILLE}', {IDADRESSE}, '{PAYS}', {ESCO}, {ENCOUR}, {NOREG}, {NOECH}, {TVADEF}, '{NOM}', '{RUE1}', '{DEP}', '{IDETVA}', '{TELEPHONE1}', '{TELEPHONE3}', {NOLIBTEL1}, '{DEVISE}', '{CODPOS}', '{DOMICI}', '{ETABLI}', '{GUICHE}', '{COMPTE}', '{CLERIB}', '{TARIF}', '{CONDPO}', '{COMMENT}', '{CREATIONLE}', '{MODIFLE}', '{TELEPHONE2}', {NOLIBTEL2}, {NOLIBTEL3}, '{RUE2}', '{RUE3}')"
    2° un tableau qui contient les valeurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    TblValues["IDFOURNISSEUR"]=1
    TblValues["VILLE"]="Bouzieux le haut"
    ....
    etc
    3° Un execution de la requête avec mise en correspondance Requête / Valeurs
    Précision : c'est une base MS Sql 2008 non Unicode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    import pymssql
    self.CnxBase = pymssql.connect(host='xxxx', user='sa', password='xxx', database='xxx')
     
    cur = self.CnxBase.cursor()
    cur.execute(Requete.format(**TblValues))
    J'ai trouvé un truc bien qui permet de détecter l'encode du texte que je récupère dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    import chardet
     
    TblCharset=chardet.detect(self.TblFicCSV[NoLigne][NoColFic])
     
    if TblCharset["encoding"]=="ascii" or TblCharset["encoding"]==None :
    	TblValues[NomChamp]=self.TblFicCSV[NoLigne][NoColFic]
    else :
    	TblValues[NomChamp]=self.TblFicCSV[NoLigne][NoColFic].decode(TblCharset["encoding"]).encode('iso-8859-1')
    Le problème se situe maintenant au niveau de l'execution de la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cur.execute(Requete.format(**TblValues))
    il me réponds :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    File "/usr/local/lib/python2.6/dist-packages/pymssql.py", line 196, in execute
        raise OperationalError, e[0]
    pymssql.OperationalError: SQL Server message 105, severity 15, state 1, line 1:
    Unclosed quotation mark after the character string 'Josef-Sch'.
    DB-Lib error message 105, severity 15:
    General SQL Server error: Check messages from the SQL Server
    SQL Server message 102, severity 15, state 1, line 1:
    Incorrect syntax near 'Josef-Sch'.
    DB-Lib error message 102, severity 15:
    General SQL Server error: Check messages from the SQL Server
    On peut constater que mon adresse est tronquée au niveau du ü : Incorrect syntax near 'Josef-Sch'.

    Quelqu'un a une idée avant que je me tire une balle ?

  16. #16
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par edblv Voir le message
    Unclosed quotation mark after the character string 'Josef-Sch'.
    C'est surtout ça que je retiens, ça semblerait vouloir dire que tu as passé une chaine non refermée, genre "Josef-Sch au lieu de "Josef-Sch". Comme tu n'as pas posté la requete, pas moyen de savoir.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    C'est surtout ça que je retiens, ça semblerait vouloir dire que tu as passé une chaine non refermée, genre "Josef-Sch au lieu de "Josef-Sch". Comme tu n'as pas posté la requete, pas moyen de savoir.
    Non ! Justement, je lui passe la chaîne complète mais elle est tronquée au niveau du ü et je n'arrive pas à comprendre pourquoi.

    Bon alors voilà la requête telle qu'elle est générée par mon code (affichée par un print dans ma boucle) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO MaTable (IDFOURNISSEUR, VILLE, IDADRESSE, PAYS, ESCO, ENCOUR, NOREG, NOECH, TVADEF, NOM, RUE1, DEP, IDETVA, TELEPHONE1, TELEPHONE3, NOLIBTEL1, DEVISE, CODPOS, DOMICI, ETABLI, GUICHE, COMPTE, CLERIB, TARIF, CONDPO, COMMENT, CREATIONLE, MODIFLE, TELEPHONE2, NOLIBTEL2, NOLIBTEL3, RUE2, RUE3) VALUES (1674, 'SINGEN', 3852, 'ALLEMAGNE', 0, 0, 7, 17, 7, 'Le nom du fournisseur', 'Josef-Schüttler -Str 17', '', 'DE811578832', '06 07 08 09', '0049 01 01 001 001', 1, 'EUR', '78224', '', '', '', '', '', 'AB', 'F', '', '', '2010-03-09', 'toto@toto.fr', 6, 2, '', '')
    Pour obtenir ça j'ai dû faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Requete=unicode(Requete)
    Du coup j'obtiens ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File "/usr/local/lib/python2.6/dist-packages/pymssql.py", line 190, in execute
        self._source.execute_query(operation)
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 410: ordinal not in range(128)
    J'en peu plus !
    Je crois que je vais allé bouffer...

  18. #18
    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,

    Si MS SQL est bien en 'iso-8859-1' (appelé aussi 'latin1'), il devrait accepter 'Josef-Schüttler' parce que le 'ü' en fait partie (voir: http://fr.wikipedia.org/wiki/ISO_8859-1).

    On peut d'ailleurs voir dans le tableau que ce caractère est codé comme '\xfc', ce qui explique l'affichage 'Josef-Sch\xfcttler'. Cela veut dire aussi que ta console d'affichage ne supporte pas le 'ü', mais c'est un autre problème.

    Bref, si MS SQL accepte le latin1 et ne supporte pas le 'ü' de 'Schüttler', c'est que son encodage n'est pas correct. Ou, comme le dit pfeuh, parce qu'il y a un pb de syntaxe.

    En tout cas, je confirme que Python permet de faire absolument tout ce qu'on veut en matière d'encodage: certifie donc l'encodage de la chaine origine et celle destination, et on peut te dire comment faire la conversion. Mais il faut être précis: tu ne peux pas dire que ta chaine origine est "utf-8 ou latin-1": c'est l'un ou l'autre!

    Tyrtamos

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2006
    Messages : 121
    Par défaut
    Ohhhh joie !!!

    J'ai enfin réussi et je crois que je vais allé courrir nu dans le jardin pour fêter ça !!

    Alors, j'explique pour ceux que ça intérresse.
    En fait le problème ne se situait pas au niveau de la génération de la requête mais de la classe que j'utilisait pour l'éxecuter.
    J'ai utilisé pymssql et c'était une erreur.
    J'ai changé pour pyodbc et tout s'est débloqué.

    Je suppose que pymssql n'est pas capable d'interpréter une chaîne unicode.

    En tout cas merci infiniement à ceux qui se sont penchés sur mon problème.
    J'espère que cette discussion permettra à certains de gagner les deux jours que je viens de perdre.

  20. #20
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par edblv Voir le message
    et je crois que je vais allé courrir nu dans le jardin pour fêter ça !!
    Prends une vidéo que tout le monde en profite...

    Citation Envoyé par edblv Voir le message
    Alors, j'explique pour ceux que ça intérresse.
    En fait le problème ne se situait pas au niveau de la génération de la requête mais de la classe que j'utilisait pour l'éxecuter.
    J'ai utilisé pymssql et c'était une erreur.
    J'ai changé pour pyodbc et tout s'est débloqué.

    Je suppose que pymssql n'est pas capable d'interpréter une chaîne unicode.
    Bizarre. A priori, pymssql n'a aucune raison d'interpréter la chaine. Son rôle est de la bazarder au serveur bdd et basta. Enfin c'est une supposition car je connais pas cette librairie. Donc on va admettre que ton pb est réglé...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 0
    Dernier message: 26/05/2009, 15h08
  2. Transformation code ASCII en UTF-8
    Par identifiant_bidon dans le forum Langage
    Réponses: 1
    Dernier message: 13/11/2007, 14h56
  3. [.NET 2.0] Convertir une chaine utf-8 en Ascii
    Par abelman dans le forum Framework .NET
    Réponses: 2
    Dernier message: 30/04/2007, 20h47
  4. Conversion utf-8 an code ascii
    Par Haplo2006 dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2007, 10h11
  5. [C#] Encodage en UTF et ASCII
    Par Machjaghjolu dans le forum C#
    Réponses: 3
    Dernier message: 11/11/2005, 02h19

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