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

  1. #!/usr/bin/env python
  2. # coding: UTF-8
  3. import codecs
  4. import sys
  5. import locale
  6.  
  7.  
  8. def getTerminalCharset():
  9.     """Guess terminal charset using differents tests
  10.  
  11.    From http://www.haypocalc.com/wiki/Python_Unicode
  12.    """
  13.     # (1) Try locale.getpreferredencoding()
  14.     try:
  15.         charset = locale.getpreferredencoding()
  16.         if charset:
  17.             return charset
  18.     except (locale.Error, AttributeError):
  19.         pass
  20.  
  21.     # (2) Try locale.nl_langinfo(CODESET)
  22.     try:
  23.         charset = locale.nl_langinfo(locale.CODESET)
  24.         if charset:
  25.             return charset
  26.     except (locale.Error, AttributeError):
  27.         pass
  28.  
  29.     # (3) Try sys.stdout.encoding
  30.     if hasattr(sys.stdout, "encoding") and sys.stdout.encoding:
  31.         return sys.stdout.encoding
  32.  
  33.     # (4) Otherwise, returns "ASCII"
  34.     return "ASCII"
  35.  
  36. charset = getTerminalCharset()
  37. print("Encodage de la console : %s" % charset)
  38.  
  39. # Ici l'encodage de la chaine n'est pas connu de python, c'est celui du fichier
  40. str_string = "Benoît"
  41. # Là Python utilise l'information "coding" en deuxième ligne du fichier
  42. # et transforme la chaine en unicode ; la différence et le petit "u"
  43. unicode_string = u"Benoît"
  44.  
  45. # Essayons d'afficher les deux string ensemble :
  46. # * soit dans une chaine de type str
  47. try:
  48.     print("%s  ; %s" % (str_string, unicode_string))
  49. except UnicodeDecodeError as error:
  50.     print(error)
  51. # * soit dans une chaine de type unicode
  52. try:
  53.     print(u"%s  ; %s" % (str_string, unicode_string))
  54. except UnicodeDecodeError as error:
  55.     print(error)
  56.  
  57. # Même problème dans les deux cas, on mélange str et unicode
  58. # Python essaye de convertir implicitement, mais ne peut pas deviner l'encodage
  59. # de str_string et essaye avec ASCII ... échec.
  60.  
  61. # Deux solutions :
  62. # * convertir d'abord unicode_string dans l'encodage de la console
  63. print("%s ; %s" % (str_string, unicode_string.encode(charset)))
  64. # * convertir d'abord str_string en unicode ; dans ce cas, l'ensemble de la
  65. # chaîne sera à nouveau convertis implicitement dans l'encodage de la console
  66. # pour affichage
  67. print(u"%s ; %s" % (str_string.decode(charset), unicode_string))
  68.  
  69. # Résumé
  70. print('Type : %s ; repr : %s ; valeur : %s' % (
  71.         type(str_string),
  72.         repr(str_string),
  73.         str_string))
  74. print(u'Type : %s ; repr : %s ; valeur : %s' % (
  75.         unicode(repr(type(unicode_string))),
  76.         unicode(repr(unicode_string)),
  77.         unicode_string))

Télécharger

 
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