Problème d'encodage de caractères spéciaux

nournina
Messages postés
52
Date d'inscription
dimanche 27 octobre 2013
Statut
Membre
Dernière intervention
17 juin 2014
- Modifié par nournina le 13/05/2014 à 21:56
taz_iup
Messages postés
179
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
21 mai 2014
- 21 mai 2014 à 17:41
bonjour ,
je fait une boucle qui lire une chaine de caractère ensuite fait des changement selon le caractère voici le code:
#! /usr/bin/ python
# -*- coding: utf-8 -*-
# -*- coding:cp1256 -*-
import string 
import sys
listea = ['b','c']
listeb = ['a','c']
listec = ['a','b']
listee = ['é','è','à']
listemot = [ ]
mot = None
mot1 = None
mot1 = mot.encode('utf-8') 
for i in range(len(mot1)) :
      mot1 = mot
      if mot[i] == 'a':
           for j in range(len(listea)) :
                mot = mot[:i] + listea[j] + mot[i+1:]
                mot1 = mot.encode('utf-8')
                listemot.append(mot1)
      elif mot[i] == 'b':
           for j in range(len(listeb)) :
                mot = mot[:i] + listeb[j] + mot[i+1:]
                mot1 = mot.encode('utf-8')
                listemot.append(mot1)
       elif mot[i] == 'c':
           for j in range(len(listec)) :
               mot = mot[:i] + listec[j] + mot[i+1:]
               mot1 = mot.encode('utf-8')
               listemot.append(mot1)    
       elif mot[i] == 'e':
           for j in range(len(listee)) :
               mot = mot[:i] + listee[j] + mot[i+1:]
               mot1 = mot.encode('utf-8')
               listemot.append(mot1)      
print listemot 


le problème c'est l'encadage de caractère é ,è ,à il m'affiche des chinois.
s'il vous plait si vous pouvez m'aidez à résoudre mon problème
merci bien

2 réponses

YepoMax
Messages postés
74
Date d'inscription
samedi 8 décembre 2012
Statut
Membre
Dernière intervention
14 juin 2014
20
14 mai 2014 à 23:36
YepoMax - 14 mai 2014 à 23:33
Je vous conseille dans ce cas de convertir tous vos caractères spéciaux en UNICODE.

Au lieu de "é", utilisez "\u00e9" et au lieu de "à", utilisez "\u00e0".
"\u" indique que les caractères qui suivent sont une référence UNICODE - "\u00e9" est une chaine de caractère de longueur 1 (comme "é") !!
Pour d'autres codes UNICODE, utilisez "\u" suivi du code correspondant que vous trouverez ici : http://unicode-table.com/
1
nournina
Messages postés
52
Date d'inscription
dimanche 27 octobre 2013
Statut
Membre
Dernière intervention
17 juin 2014
1
15 mai 2014 à 23:34
merci pour votre idée mais quand je déclare la liste
listee = ['\u00e9','\u00e0']

ensuite je veut afficher la liste qui contienne les mots il m'affiche la partie qui contienne le à et é codé et moi je veut qu'il m'affiche le mot bien écrit
merci bien
0
YepoMax
Messages postés
74
Date d'inscription
samedi 8 décembre 2012
Statut
Membre
Dernière intervention
14 juin 2014
20
16 mai 2014 à 02:11
Normalement, "\u00e9" devrait s'afficher "é" automatiquement, je ne comprend pas trop le problème.

Par contre, lors du

print listemot


vous aurez des caractères du style "\xc3\xa9" qui sont au fait des bytes.
Votre liste de mots contient des bytes parce que vous faites à chaque fois mot.encode("utf-8"), ce qui retourne des bytes et non une chaine de caractères !

Note au passage :
mot1 = mot.encode('utf-8')
listemot.append(mot1)   

# Peut s'écrire :
listemot.append( mot.encode('utf-8') )
0
nournina
Messages postés
52
Date d'inscription
dimanche 27 octobre 2013
Statut
Membre
Dernière intervention
17 juin 2014
1
17 mai 2014 à 22:18
merci bien monsieur pour la remarque
et maintenant que je doit faire pour régler ce problème d'encodage je jeux afficher des chaîne de caractère si le mot en entrer est: "amitié"
le fichier résultat affiche les mots suivants:
bmitié,cmitié,amitie,amitià
comment faire ça !!!
voici mon code :

# -*- coding:Utf-8 -*-

import sys
import string

listea = ['b','c']
listeb = ['a','c']
listec = ['a','b']
listee = ['e','à']
listemot = []
test = open ('test.txt','r')
resultat1 = open ('resultat1.txt', "w")
mot = test.readline().decode('utf-8') 
print mot
for i in range(len(mot)) :
    if mot[i] == 'a':
        for j in range(len(listea)) :
            mot = mot[:i] + listea[j] + mot[i+1:]
            listemot.append(mot.encode('utf-8'))
    elif mot[i] == 'b':
        for j in range(len(listeb)) :
            mot = mot[:i] + listeb[j] + mot[i+1:]
            listemot.append(mot.encode('utf-8'))
    elif mot[i] == 'c':
        for j in range(len(listec)) :
            mot = mot[:i] + listec[j] + mot[i+1:]
            listemot.append(mot.encode('utf-8'))    
    elif mot[i] == 'é':
        for j in range(len(listee)) :
            mot = mot[:i] + listee[j] + mot[i+1:]
            listemot.append(mot.encode('utf-8'))
print listemot            
resultat1.writelines(listemot) 
resultat1.close()
test.close()
0
YepoMax
Messages postés
74
Date d'inscription
samedi 8 décembre 2012
Statut
Membre
Dernière intervention
14 juin 2014
20
17 mai 2014 à 23:06
Au fait je n'ai pas bien compris votre objectif : que voulez vous récupérer dans la liste "listemot" ?
Avec amitié, votre code va en effet rendre ["bmitié", "cmitié", "amitie","amitià"]. Mais que voudriez vous qu'il vous donne comme résultat ?
0
nournina
Messages postés
52
Date d'inscription
dimanche 27 octobre 2013
Statut
Membre
Dernière intervention
17 juin 2014
1
17 mai 2014 à 23:19
la liste "listemot" va récupérer les nouveaux mots aprés le changement de lettre
et enfin je veut écrire les nouveaus mots dans le fichier résultat
j'espère que vous comprenez mon objectif
merci
0