Python Unicode
Un article de Haypo.
Version du 17 août 2007 à 10:30 (modifier) Haypo (Discuter | Contributions) (→Supprimer les accents) ← Différence précédente |
Version du 17 août 2007 à 12:54 (modifier) (défaire) Haypo (Discuter | Contributions) (→Supprimer les accents) Différence suivante → |
||
Ligne 64 : | Ligne 64 : | ||
Liens: | Liens: | ||
* Mon script '''[http://www.haypocalc.com/perso/prog/python/unicode2ascii.py unicode2ascii.py]''' | * Mon script '''[http://www.haypocalc.com/perso/prog/python/unicode2ascii.py unicode2ascii.py]''' | ||
- | * Mon script [http://www.haypocalc.com/perso/prog/python/any2ascii.py any2ascii.py] (ancien script, incomplet) | ||
* Billet de Peter Bengtsson: ''[http://www.peterbe.com/plog/unicode-to-ascii Unicode strings to ASCII... nicely]'' | * Billet de Peter Bengtsson: ''[http://www.peterbe.com/plog/unicode-to-ascii Unicode strings to ASCII... nicely]'' | ||
Version du 17 août 2007 à 12:54
Sommaire |
Python et Unicode
Depuis sa version 2.0, publié en octobre 2000, Python possède le type « unicode » qui permet de stocker du texte dans le charset Unicode. En interne, c'est un type de 16 bits (UCS-2) ou 32 bits (UCS-4) qui est utilisé. On est donc limité aux codes 0 à 65.535 / 0 à 4.294.967.295.
Type str
Le type « str » ne devrait pas servir à contenir du texte. C'est un tableau d'octet et sûrement pas un tableau de caractères (contrairement au type « unicode »).
Deviner le charset utilisé par un type str n'est pas une mince affaire. Voici néanmoins quelques cas particulier.
isASCII()
def isASCII(text): try: text = unicode(text, 'ASCII', 'strict') return True except UnicodeDecodeError: return False
Comprendre le résultat :
- False indique que text contient des valeurs supérieures ou égales à 128
- True indique que text utilise (semble utiliser ?) le charset ASCII
isUTF8()
def isUTF8(text): try: text = unicode(text, 'UTF-8', 'strict') return True except UnicodeDecodeError: return False
Comprendre le résultat :
- False indique que la conversion a échoué, une séquence d'octets invalide a été trouvée (chaîne tronquée ? autre charset utilisé ?)
- True indique que la conversion s'est bien déroulée, il y a de très fortes chances que la chaîne soit formatée en UTF-8
guessBytesCharset()
J'ai écrit une fonction appelée guessBytesCharset() qui tente au mieux de détecter le charset d'une chaîne binaire. On peut la trouver dans le code d'Hachoir : module hachoir_core.i18n.
Encodage
Encodage MIME
Pour décoder la chaîne "S=C3=A9bastien", on peut utiliser la regex du pauvre :
>>> import re; re.sub("=([A-F0-9]{2})", lambda regs: chr(int(regs.group(1), 16)), "S=C3=A9bastien") 'S\xc3\xa9bastien'
Mais le module mimify sert exactement à ça :-)
Base64
Pour décoder des données encodée en base64 (ex: 'VG90bw=='), le module base64 dispose des fonctions b64encode() et b64decode().
Voir aussi la RFC 3548, The Base16, Base32, and Base64 Data Encodings.
Autres encodages
Voir aussi les modules binascii, quopri (quoted printable), uu, etc.
Supprimer les accents
Liens:
- Mon script unicode2ascii.py
- Billet de Peter Bengtsson: Unicode strings to ASCII... nicely