Comme d'autres l'ont dit, # coding:
spécifie le codage dans lequel le fichier source est enregistré. Voici quelques exemples pour illustrer cela:
Un fichier enregistré sur le disque en tant que cp437 (mon encodage de console), mais aucun encodage déclaré
b = 'über'
u = u'über'
print b,repr(b)
print u,repr(u)
Production:
File "C:\ex.py", line 1
SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no
encoding declared; see http://www.python.org/peps/pep-0263.html for details
Sortie du fichier avec # coding: cp437
ajouté:
über '\x81ber'
über u'\xfcber'
Au début, Python ne connaissait pas l'encodage et se plaignait du caractère non ASCII. Une fois qu'elle a connu le codage, la chaîne d'octets a obtenu les octets qui étaient réellement sur le disque. Pour la chaîne Unicode, Python a lu \ x81, savait que dans cp437 c'était un ü , et l'a décodé dans le point de code Unicode pour ü qui est U + 00FC. Lorsque la chaîne d'octets a été imprimée, Python a envoyé la valeur hexadécimale 81
directement à la console. Lorsque la chaîne Unicode a été imprimée, Python a correctement détecté le codage de ma console en tant que cp437 et traduit Unicode ü en valeur cp437 pour ü .
Voici ce qui se passe avec un fichier déclaré et enregistré en UTF-8:
├╝ber '\xc3\xbcber'
über u'\xfcber'
En UTF-8, ü est codé en octets hexadécimaux C3 BC
, la chaîne d'octets contient donc ces octets, mais la chaîne Unicode est identique au premier exemple. Python a lu les deux octets et les a décodés correctement. Python n'a pas imprimé correctement la chaîne d'octets, car il a envoyé les deux octets UTF-8 représentant ü directement à ma console cp437.
Ici, le fichier est déclaré cp437, mais enregistré en UTF-8:
├╝ber '\xc3\xbcber'
├╝ber u'\u251c\u255dber'
La chaîne d'octets contient toujours les octets sur le disque (octets hexadécimaux UTF-8 C3 BC
), mais les interprète comme deux caractères cp437 au lieu d'un seul caractère encodé en UTF-8. Ces deux caractères ont été traduits en points de code Unicode et tout ne s'imprime pas correctement.
# coding: utf8
est assez bon, pas besoin de-*-