rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

[Python] Utf-8 une bonne fois pour toutes

kilian, le mardi 25 octobre 2005 à 11:30:23
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:
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.
Configuration: Python 2.4.2
Répondre à kilian  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 11:40:53
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.
Répondre à sebsauvage

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 11:51:22
Pour écrire un fichier UTF-8, par exemple:

#!/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.)
Répondre à sebsauvage

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 11:52:45
Le code ci-dessus produit bien un fichier UTF-8:
Le vélo dans le près.
Répondre à sebsauvage

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 11:53:37
(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).
Répondre à sebsauvage

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le mardi 25 octobre 2005 à 12:14:28
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.
Répondre à kilian

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le mardi 25 octobre 2005 à 12:27:53
J'ai chopé un des endroits ou ça coince.
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?
Répondre à kilian

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 13:42:01
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.
Répondre à sebsauvage

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le mardi 25 octobre 2005 à 14:17:33
Alors en fait, je n'arrive pas à convertir value[0] en unicode.
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...
Répondre à kilian

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 14:25:55
Quand tu fais un type(value[0]), il affiche quoi ?
Répondre à sebsauvage

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le mardi 25 octobre 2005 à 14:41:12
<type 'str'>

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...
Répondre à kilian

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sebsauvage, le mardi 25 octobre 2005 à 15:08:36
ok.
Répondre à sebsauvage

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 kilian, le mardi 25 octobre 2005 à 15:18:30
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.....
Répondre à kilian
[utf-8] codage de page non-reconnu (Résolu)Hi All, J'ai écris une page HTML en UTF-8. J'ai une balise . Tout ce qu'il faut pour afficher une page en utf-8. Mais quand j'ouvre la page dans un navigateur, elle... www.commentcamarche.net/forum/affich-2030499-utf-8-codage-de-page-non-reconnu
Firefox probleme d'affichage (UTF 8) (Résolu)Bonjour! J'essaie de faire un site de cuisine en turque avec notepad++ et en m'aidant de quelques tuto sur internet. Le probleme c'est qu'en turc, il y a des caracteres speciaux, donc je dois encoder sous UTF 8 et je met charset=... www.commentcamarche.net/forum/affich-3501925-firefox-probleme-d-affichage-utf-8
UTF-8 to WinAnsiEncoding (Résolu)J'essaie de passer les signes arab en UTF-8 à un document PDF qui s'affiche dans le navigateur. Pour ceci je dois les d'abord convertir en winAnsiEncoding. J'ai essaié mb_convert_encoding($translation, "winAnsiEncoding", "UTF-8");... www.commentcamarche.net/forum/affich-2608197-utf-8-to-winansiencoding
Utiliser des accents et autres caractères spéciauxDans la plupart des langages de programmation, on ne peut utiliser directement les accents et autres caractères non-anglosaxon. La solution est l'unicode, une sorte de code universel. Par exemple pour afficher la chaine de caractères : " là, ça... www.commentcamarche.net/faq/sujet-188-utiliser-des-accents-et-autres-caracteres-speciaux
[MSN] Erreur de connexion (80048820)Erreur 8048820 Avant toute modification sur votre système, vérifiez l'état des serveurs MSN Messenger, afin de déterminer si le problème ne vient pas de là : http://messenger.msn.com/Status.aspx?mkt=fr-fr Il peut également s'agir d'un problème... www.commentcamarche.net/faq/sujet-2728-msn-erreur-de-connexion-80048820
MSN - Erreur de connexion 80048439Erreur 80048439 Avant toute modification sur votre système, vérifiez l'état des serveurs MSN Messenger, afin de déterminer si le problème ne vient pas de là : http://messenger.msn.com/Status.aspx?mkt=fr-fr Il peut également s'agir d'un problème... www.commentcamarche.net/faq/sujet-6123-msn-erreur-de-connexion-80048439
[utf8] probleme accent mysql (Résolu)Bonjour, j'ai un probleme d'accent ... j'ai une base de donnée mysql avec : Jeu de caractères pour MySQL: UTF-8 Unicode (utf8) Interclassement pour la connection MySQL: utf8_general_ci dans laquelle il y'a une table avec... www.commentcamarche.net/forum/affich-3261825-utf8-probleme-accent-mysql
[PHP/MySQL] Encodage Caractères (Résolu)Bonjour, c'est encore moi :) J'ai enfin réussi (ou presque) à écrire un petit script pour poster des News. Le problème : J'ai tout rédigé les pages PHP en UTF-8 et lorsque je stocke les données dans MySQL, il ne semble pas bien... www.commentcamarche.net/forum/affich-2235775-php-mysql-encodage-caracteres
Xml en utf8 -> pb importation sur html (Résolu)Bonjour, Je souhaite mettre un flux RSS sur mon site. Malheureusement, le flux est codé en utf-8, et mon site est en iso-8859-1. Voici le script qui me permet d'afficher le flux. www.commentcamarche.net/forum/affich-4756844-xml-en-utf8-pb-importation-sur-html
Télécharger PSPadPSPad est un excellent éditeur de texte. Il est utile pour travailler sur du simple texte, mais aussi sur du HTML, CSS, Javascript, php ou autres langages de programmation (C++, Java, Python...). Les fonctionnalités sont impressionnantes: ... www.commentcamarche.net/telecharger/telecharger-133-pspad
Nokia N95 8 GoN 95 ,Autonomie en conversation : 5h, autonomie en veille : 280 h, Appareil photo : Oui, Integré, 128 grammes, WAP, GPRS, MP3, Indice DAS : 0.62 W/Kg,Type de batterie:Li-Ion,GPRS,HSCSD,3G,MMS,WAP,WAP version/sécurité:2.0,Push To Talk,Indice D.A.S:0.62... www.commentcamarche.net/guide-achat/nokia-n95-8-go-1006274-fiche-technique
Apple iPhone 8 GoAutonomie en conversation : 5h, autonomie en veille : 0 h, Appareil photo : Oui, Integré, 135 grammes, GPRS, MP3, Indice DAS : 0.0 W/Kg,GPRS,Temps de veille:0 heures,Durée de conversation:5.0 heures,Poids avec batterie standard :135.0 g,Page web du... www.commentcamarche.net/guide-achat/apple-iphone-8-go-866081-fiche-technique
Apple iPod Touch 8 Go BlackUSB 2.0, Capacité : 8 GB, Type de lecteur : Lecteur Multimedia, Type de mémoire : Flash,Poids:120.0 g,Autonomie:22.0 heures,Divers:Wi-Fi (802.11b/g), Accelerometer,Dimensions (HxLxP):11x6.18x0.8 cm,Page web du produit:Anglais,Type de batterie:Lithium... www.commentcamarche.net/guide-achat/apple-ipod-touch-8-go-black-1001876-fiche-technique
PHP - Parser du XML PHP permet l'analyse syntaxique (parsage ou parsing en anglais) d'un document XML. Le langage XML (eXtensible Markup Language, traduisez Langage à balises extensibles) est un métalangage, c'est-à-dire un langage permettant de définir votre propre... www.commentcamarche.net/php/phpxml.php3
WiFi - 802.1x Le standard 802.1x est une solution de sécurisation, mise au point par l'IEEE en juin 2001, permettant d'authentifier (identifier) un utilisateur souhaitant accéder à un réseau (filaire ou non) grâce à un serveur d'authentification. Le 802.1x repose... www.commentcamarche.net/wifi/wifi-802.1x.php3
Wifi - 802.11i / WPA2 Le 802.11i a été ratifié le 24 juin 2004, afin de fournir une solution de sécurisation poussée des réseaux WiFi. Il s'appuie sur l'algorithme de chiffrement TKIP, comme le WPE, mais supporte également l'AES (Advanced Encryption Standard), beaucoup... www.commentcamarche.net/wifi/wifi-wpa2.php3
Toutes les réponses pour « [Python] Utf 8 une bonne fois pour toutes »