Python problème d'encodage

Bonjour, c’est encore moi.
Je cherche à supprimer tous les caractères spéciaux d’une chaîne de caractère. En cherchant dans la doc j’ai construit une méthode clean.py:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import unicodedata

def clean_string(s):
    s = unicode(s, "utf8", "replace")
    s = unicodedata.normalize('NFD', s)
    return s.encode('ascii', 'ignore')

ça marche très bien si je l’utilise directement par contre j’essaie de l’intégrer à mon programme:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import clean
... 
clean.clean_string(le_nom)

et là j’ai une erreur:

 le_nom = unicode(le_nom, "utf8", "replace")
TypeError: decoding Unicode is not supported

Je ne comprends pas pourquoi

[edit] je précise ma variable ‘le_nom’ provient d’un widget de type entry:

le_nom=monwidget.get()

Merci

Ah, encore toi.
Quelle est la valeur de le_nom ?
Peut-on avoir l’exception Python en entier ?

Dans le_nom il y a ce que j’entre dans le widget “éÉàÀ” par exemple

L’erreur complète est celà:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__
    return self.func(*args)
  File "PyRecord.py", line 87, in validNom
    clean.clean_string(le_nom)
  File "/home/PyRecord/clean.py", line 6, in clean_string
    s = unicode(s, "utf8", "replace")
TypeError: decoding Unicode is not supported

La variable le_nom est déjà encodée en unicode, du coup, il ne peut pas le convertir.
En fait, la fonction unicode () sort déjà une variable unicode, du coup, il n’en prend pas en entrée.
Je te conseille un truc du genre :

def clean_string(s): try: s = unicode(s, "utf8", "replace") except TypeError: pass s = unicodedata.normalize('NFD', s) return s.encode('ascii', 'ignore')

Effectivement l’erreur n’est plus là mais les accents ne sont pas supprimés ma fonction clean_string(s) ne marche plus… Même lorsque j’essaie directement, pourtant il me semblait l’avoir vu fonctionner??

#!/usr/bin/python
# -*- coding: utf-8 -*-
import unicodedata

def clean_string(s):
    try:
        s = unicode(s, "utf8", "replace")
    except TypeError:
        pass
    s = unicodedata.normalize('NFD', s)
    return s.encode('ascii', 'ignore')


le_nom="éÉàÀ"
clean_string(le_nom)
print le_nom

ça me ressort éÉàÀ avec les accents…

en enlevant ‘ignore’ je vois l’erreur:

return s.encode('ascii')

UnicodeEncodeError: ‘ascii’ codec can’t encode character u’\u0300’ in position 1: ordinal not in range(128)

Il faut peut-être récupérer le retour de la fonction clean_string () ? Genre un truc du genre :

ça ne change rien… :confused:

Ça ?

[code]#!/usr/bin/python2

-- coding: utf-8 --

import unicodedata

def clean_string(s):
try:
s = unicode(s, “utf8”, “replace”)
except TypeError:
print (‘u’)
pass
s = unicodedata.normalize(‘NFD’, s)
return s.encode(‘ascii’, ‘ignore’)

le_nom='éÉàÀ’
le_nom = clean_string(le_nom)
print le_nom[/code]

oui, c’est pareil

Ben, ça alors, moi, j’ai ce code-là :

[code]#!/usr/bin/python2

-- coding: utf-8 --

import unicodedata

def clean_string(s):
try:
s = unicode(s, “utf8”, “replace”)
except TypeError:
pass
s = unicodedata.normalize(‘NFD’, s)
return s.encode(‘ascii’, ‘ignore’)

le_nom='éÉàÀ’
le_nom = clean_string(le_nom)
print le_nom[/code]
et ça me retourne ça quand je le lance :

┌ (gilles@Stardust + 0) (26/06/16 - 16:23:33) (0.95 - 18%) (~) └% python2 ./misc/le_nom.py eEaA

Ah moi ça marche maintenant!!
Je sais plus ce que j’ai changé mais le code que tu as mis juste à l’instant marche très bien chez moi
Ça me sort bien:
eEaA

Super, je me disais bien.
Bon, problème résolu.

Oui, merci!
Jusqu’au prochain… :wink:

Mais l’autre ne l’est toujours pas… Bon pour l’instant ce n’est pas grave je n’ai qu’une vingtaine de commande à écrire à la main, mais je sais que j’ai une fonction où il me faudra écrire 150 commandes selon … :confused: