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