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))
 
A propos de INTRW

Journal web de Benoît LAURENT, entre photos, voyages et logiciels libres selon les périodes.

Fils de nouvelles RSS
Thèmes