Comme d'autres l'ont dit, # coding:
spécifie l'encodage 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)
Sortie :
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'il connaissait l'encodage, la chaîne d'octets obtenait les octets qui se trouvaient réellement sur le disque. Pour la chaîne Unicode, Python a lu \x81 Je savais que dans le CP437, c'était une ü et l'a décodé dans le codepoint Unicode pour ü qui est U+00FC. Lorsque la chaîne d'octets a été imprimée, Python a envoyé la valeur hexadécimale 81
à la console directement. Lorsque la chaîne Unicode a été imprimée, Python a correctement détecté mon encodage de console comme étant cp437 et a traduit Unicode ü à la 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é sous forme d'octets hexadécimaux C3 BC
La chaîne d'octets contient donc ces octets, mais la chaîne Unicode est identique à celle du premier exemple. Python a lu les deux octets et les a décodés correctement. Python a imprimé la chaîne d'octets de manière incorrecte, car il a envoyé les deux octets UTF-8 représentant ü directement sur 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 a toujours les octets sur le disque (octets hexagonaux UTF-8). C3 BC
), mais les interprétait 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 s'imprime de manière incorrecte.
6 votes
# coding: utf8
est suffisant, pas besoin de-*-
1 votes
@jellyfish Je suppose que vous vouliez taper
# coding: utf-8
.0 votes
Devrait être
#coding=utf-8
. python.org/dev/peps/pep-0263