[Python] Utf-8 une bonne fois pour toutes
kilian
Messages postés
8732
Date d'inscription
Statut
Modérateur
Dernière intervention
-
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
kilian Messages postés 8732 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
J'ai un script qui repertorie les valeurs dans la base de registres.
Lorsque python trouve un valeur entiere il récupère la valeure en tant qu'entiere.
Mais j'ai besoin de concatenatener le nom de la clé et la valeur donc je convertis parfois la valeur en une chaine avec str()
Mais str() tente de convertir en ascii, donc quand il bute sur une valeur supérieure à 127, j'ai une erreur.
Ex:
J'ai essayé unicode() mais unicode n'ncode que des chaines. Même chose avec encode("utf-8). D'ailleurs je préfèrerais de l'utf-8.
Pensez vous qu'il y ait une manière pour que str() transforme un entier en une chaine encodée en utf-8 ? Ou y a t'il une fonction que puisse faire ça...?
Merci d'avance.
J'ai un script qui repertorie les valeurs dans la base de registres.
Lorsque python trouve un valeur entiere il récupère la valeure en tant qu'entiere.
Mais j'ai besoin de concatenatener le nom de la clé et la valeur donc je convertis parfois la valeur en une chaine avec str()
Mais str() tente de convertir en ascii, donc quand il bute sur une valeur supérieure à 127, j'ai une erreur.
Ex:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 3: ordinal not in range(128)
J'ai essayé unicode() mais unicode n'ncode que des chaines. Même chose avec encode("utf-8). D'ailleurs je préfèrerais de l'utf-8.
Pensez vous qu'il y ait une manière pour que str() transforme un entier en une chaine encodée en utf-8 ? Ou y a t'il une fonction que puisse faire ça...?
Merci d'avance.
A voir également:
- Python utf-8
- Clé windows 8 - Guide
- Mixcraft 8 - Télécharger - Création musicale
- Citizen code python avis - Accueil - Outils
- Internet explorer 8 - Télécharger - Navigateurs
- Windows 8 pro - Télécharger - Systèmes d'exploitation
12 réponses
Pour écrire un fichier UTF-8, par exemple:
Comme tu peux voir, il n'y a aucune conversion à faire sur 'chaine' car Python utilise déjà en interne Unicode (et il n'a donc aucun difficulté à l'écrire en UTF-8 dans le fichier.)
#!/usr/bin/python # -*- coding: iso-8859-1 -*- import codecs chaine = "Le vélo dans le près." out = file( "monfichier.txt", "w" ) out.write( codecs.BOM_UTF8 ) out.write( chaine) out.close()
Comme tu peux voir, il n'y a aucune conversion à faire sur 'chaine' car Python utilise déjà en interne Unicode (et il n'a donc aucun difficulté à l'écrire en UTF-8 dans le fichier.)
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 3: ordinal not in range(128)
En interne, python utilise de l'Unicode.
A priori, ton erreur, elle ressemble plus à un PRINT ou sys.stdout.write() qui ne parvient pas à afficher ta chaîne.
(Puisque Python considère que la console est ASCII, il tente de convertir les chaînes Unicode/UTF-8 en ASCII, d'où le "'ascii' codec can't decode").
Tu as probablement des caractères accentués dans ta chaîne que tu essaie d'afficher ou bien de sauvegarder dans un fichier texte.
En interne, python utilise de l'Unicode.
A priori, ton erreur, elle ressemble plus à un PRINT ou sys.stdout.write() qui ne parvient pas à afficher ta chaîne.
(Puisque Python considère que la console est ASCII, il tente de convertir les chaînes Unicode/UTF-8 en ASCII, d'où le "'ascii' codec can't decode").
Tu as probablement des caractères accentués dans ta chaîne que tu essaie d'afficher ou bien de sauvegarder dans un fichier texte.
(En fait, la ligne avec le BOM n'est pas strictement obligatoire, c'est juste une best-practice d'indiquer ça au début des fichiers UTF-8).
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
En fait j'ai déjà eu ce problème justement en écrivant dans un fichier texte.
Mais le soucis c'est que maintenant mon histoire se produit lors d'une simple concatenation.... Aucune sortie standard n'a été faite encore....
J'enquete et je reviens bientôt.
Mais le soucis c'est que maintenant mon histoire se produit lors d'une simple concatenation.... Aucune sortie standard n'a été faite encore....
J'enquete et je reviens bientôt.
J'ai chopé un des endroits ou ça coince.
Pour l'exception j'ai mis ce code:
Affichage:
CrÙatures
0 80 114 32 0 5 39 2
ensuite le value[0] + value[1] pour tester la concatenation donne ceci:
Y'aurait il un soucis si l'un est en ascci et l'autre en unicode par exemple?
Pour l'exception j'ai mis ce code:
print value[0] print value[1] value[0] + value[1]
Affichage:
CrÙatures
0 80 114 32 0 5 39 2
ensuite le value[0] + value[1] pour tester la concatenation donne ceci:
File "list_files.py", line 259, in enum_tree value[0] + value[1] UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 2: ordinal not in range(128)
Y'aurait il un soucis si l'un est en ascci et l'autre en unicode par exemple?
Y'aurait il un soucis si l'un est en ascci et l'autre en unicode par exemple?
Je pense que c'est ça oui.
Convertis explicitement tes chaines en Unicode avant de les concaténer.
ça devrait résoudre le problème.
Je pense que c'est ça oui.
Convertis explicitement tes chaines en Unicode avant de les concaténer.
ça devrait résoudre le problème.
Alors en fait, je n'arrive pas à convertir value[0] en unicode.
Ca me donne:
En l'occurence value[0] c'est
crÙatures
Sachant que c'est en fait un accent aigu sur le U et non pas grave (je trouve pas l'accent aigu sur le clavier ici)... En tout cas on dirait que c'est bien de ce caractère qu'il s'agit (position 2)
Bizzare...
Ca me donne:
value[0]=unicode(value[0]) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 2: ordinal not in range(128)
En l'occurence value[0] c'est
crÙatures
Sachant que c'est en fait un accent aigu sur le U et non pas grave (je trouve pas l'accent aigu sur le clavier ici)... En tout cas on dirait que c'est bien de ce caractère qu'il s'agit (position 2)
Bizzare...
<type 'str'>
En fait, mon script fait ce test avant:
Comme ça je suis de toute façon assuré que c'est une chaîne...
En fait, mon script fait ce test avant:
try: value[0] + "t" #Pour savoir si c'est bien une chaine #Sinon convertir en chaîne except: value[0]= "%s" % value[0] #Car str() ne convertit que en ascii
Comme ça je suis de toute façon assuré que c'est une chaîne...
Donc le "transtypage" se fait car je n'ai pas d'erreur au moment du formatage avec "%s", je peux même afficher value[0] avec print. Mais dés qu'il faut lui faire une opération de conversion (unicode ou utf-8), une concatenation c'est comme s'il se rendait compte soudain qu'il comptait un intrus dans ses rangs.....