Python et unicode

Unicode ?
Ressources française
; Le wiki d’Haypo comprend une section complée sur les problèmes de l’unicode : Codage des caractères et caractères spéciaux
- Comprendre_les_erreurs_unicode - pycon fr 2009
- Unicode : traiter toutes les écritures du
monde
- Joel on Software - Le minimum absolu que tout développeur doit absolument, positivement savoir sur Unicode et les jeux de caractères (aucune excuse !)
Ressources anglaises
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses !) - Joel on Software
Unicode
Et en python ?
Ressources française
Python Unicode - Haypo
sebsauvage.net - Charsets et encoding
Ressources anglaises
Python Unicode Objects
Thijs van der Vossen · Unicode in Python
eGenix.com : Library : Presentations & Talks : Designing Unicode-aware Applications in Python
PrintFails - PythonInfo Wiki
Handling International Text with Unicode « ActiveState Code
Exemple
#!/usr/bin/env python # coding: UTF-8 import codecs import sys import locale def getTerminalCharset(): """Guess terminal charset using differents tests From http://www.haypocalc.com/wiki/Python_Unicode """ # (1) Try locale.getpreferredencoding() try: charset = locale.getpreferredencoding() if charset: return charset except (locale.Error, AttributeError): pass # (2) Try locale.nl_langinfo(CODESET) try: charset = locale.nl_langinfo(locale.CODESET) if charset: return charset except (locale.Error, AttributeError): pass # (3) Try sys.stdout.encoding if hasattr(sys.stdout, "encoding") and sys.stdout.encoding: return sys.stdout.encoding # (4) Otherwise, returns "ASCII" return "ASCII" charset = getTerminalCharset() print("Encodage de la console : %s" % charset) # Ici l'encodage de la chaine n'est pas connu de python, c'est celui du fichier str_string = "Benoît" # Là Python utilise l'information "coding" en deuxième ligne du fichier # et transforme la chaine en unicode ; la différence et le petit "u" unicode_string = u"Benoît" # Essayons d'afficher les deux string ensemble : # * soit dans une chaine de type str try: print("%s ; %s" % (str_string, unicode_string)) except UnicodeDecodeError as error: print(error) # * soit dans une chaine de type unicode try: print(u"%s ; %s" % (str_string, unicode_string)) except UnicodeDecodeError as error: print(error) # Même problème dans les deux cas, on mélange str et unicode # Python essaye de convertir implicitement, mais ne peut pas deviner l'encodage # de str_string et essaye avec ASCII ... échec. # Deux solutions : # * convertir d'abord unicode_string dans l'encodage de la console print("%s ; %s" % (str_string, unicode_string.encode(charset))) # * convertir d'abord str_string en unicode ; dans ce cas, l'ensemble de la # chaîne sera à nouveau convertis implicitement dans l'encodage de la console # pour affichage print(u"%s ; %s" % (str_string.decode(charset), unicode_string)) # Résumé print('Type : %s ; repr : %s ; valeur : %s' % ( type(str_string), repr(str_string), str_string)) print(u'Type : %s ; repr : %s ; valeur : %s' % ( unicode(repr(type(unicode_string))), unicode(repr(unicode_string)), unicode_string))