Bonjour,
Je rencontre des problèmes d’encodage de mes requêtes sur une base Oracle, en python, en utilisant le module cx_oracle : ‘N°’ est renvoyé ‘N?1’, et ‘Gérard’ est renvoyé ‘Gerard’.
Après avoir DuckDuckCherché, j’ai trouvé une solution, par forcément très propre, mais qui fonctionne.
Il suffit de passer l’encodage souhaité dans la variable d’environnement NLS_LANG avant de charger le module cx_oracle (idem je suppose avec sqlplus, mais je n’ai pas testé).
Donc, ceci renvoi de la bouse :
[code]#!/usr/bin/env python
-- coding: utf-8 --
import cx_Oracle
bdd = cx_Oracle.connect(‘utilisateur’,
‘motdepasse’,
‘dsn’)
curseur = bdd.cursor()
print(bdd.encoding)
curseur.execute(requete)
print(curseur.fetchall())
curseur.close()
bdd.close()[/code]
Ce qui donne [je résume, je ne mets pas toute ma requête] :
US-ASCII
[('Gerard', 'TOTO N?1')]
Il renvoie de l’ascii, donc forcément le français passe mal, et je ne parle pas du chinois ! (ce n’est pas de l’humour, l’une des réponses trouvée sur le net concernait du chinois)
Donc, voici qui est déjà mieux :
[code]#!/usr/bin/env python
-- coding: utf-8 --
import os
os.environ[“NLS_LANG”] = “.UTF8”
import cx_Oracle
bdd = cx_Oracle.connect(‘utilisateur’,
‘motdepasse’,
‘dsn’)
curseur = bdd.cursor()
print(bdd.encoding)
curseur.execute(requete)
print(curseur.fetchall())
curseur.close()
bdd.close()[/code]
Donne
UTF-8
[('G\xc3\xa9rard', 'TOTO N\xc2\xb01')]
On avance ! Encore un effort, et ça va être bon :
[code]#!/usr/bin/env python
-- coding: utf-8 --
import os
os.environ[“NLS_LANG”] = “.UTF8”
import cx_Oracle
bdd = cx_Oracle.connect(‘utilisateur’,
‘motdepasse’,
‘dsn’)
curseur = bdd.cursor()
print(bdd.encoding)
curseur.execute(requete)
for champ in (curseur.fetchall()[0]):
try:
print(champ.decode(bdd.encoding))
except:
print(champ)
curseur.close()
bdd.close()[/code]
Donne :
[...]
Gérard
[...]
TOTO N°1
[...]
Usti
PS (edit 1) : si vous retournez les valeurs dans Libreoffice, il faut les encoder en iso-8859-1 et non utf-8 (bêtement je pensais que LO fonctionnait en utf-8 )