# \[python\] cx\_oracle et encodage

**URL:** <https://www.debian-fr.org/t/python-cx-oracle-et-encodage/57332>\
**Category:** Trucs et Astuces\
**Created:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/python-cx-oracle-et-encodage/57332 "2016-02-21T14:41:13Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ustilago](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/u/bcef8e/32.png) [@Ustilago](https://www.debian-fr.org/u/Ustilago)\
**Post date:** [Février 21, 2016, 2:41 UTC](https://www.debian-fr.org/t/python-cx-oracle-et-encodage/57332/1 "2016-02-21T14:41:13Z")

</div>

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 ![:033](https://www.debian-fr.org/uploads/default/original/1X/42cd8bd0447ecac24cdff1e26fa990a5c8442791.gif "petard") )
