PEP 263 définit comment déclarer le codage du code source Python.
Normalement, les 2 premières lignes d'un fichier Python devraient commencer par:
#!/usr/bin/python
# -*- coding: <encoding name> -*-
Mais j'ai vu beaucoup de fichiers commençant par:
#!/usr/bin/python
# -*- encoding: <encoding name> -*-
=> encodage au lieu de codage .
Alors, quelle est la bonne façon de déclarer le codage du fichier?
L' encodage est-il autorisé parce que l'expression régulière utilisée est paresseuse? Ou est-ce juste une autre forme de déclaration du codage du fichier?
Je pose cette question parce que le PEP ne parle pas d' encodage , il parle simplement de codage .
#!/usr/bin/env python
place de#!/usr/bin/python
ascii
àUTF-8
. Comparez: les documents python 2.7 avec les documents python 3.7 . Cela signifie que vous pouvez en toute sécurité omettre cet encodage si vous souhaitez le spécifierUTF-8
.Réponses:
Consultez les documents ici :
"Si un commentaire dans la première ou la deuxième ligne du script Python correspond à l'expression régulière
coding[=:]\s*([-\w.]+)
, ce commentaire est traité comme une déclaration d'encodage""Les formes recommandées de cette expression sont
qui est également reconnu par GNU Emacs, et
qui est reconnu par le VIM de Bram Moolenaar. "
Donc, vous pouvez mettre à peu près n'importe quoi avant la partie "codage", mais vous en tenir au "codage" (sans préfixe) si vous voulez être 100% compatible avec python-docs-recommandation.
Plus précisément, vous devez utiliser tout ce qui est reconnu par Python et le logiciel d'édition spécifique que vous utilisez (s'il a besoin / accepte quoi que ce soit). Par exemple, la
coding
forme est reconnue (prête à l'emploi) par GNU Emacs mais pas par Vim (oui, sans accord universel, c'est essentiellement une guerre de territoire ).la source
-*-
?-*-
garantit que la ligne est reconnue par GNU Emacs (un éditeur de texte populaire auprès de certains programmeurs). Notez que, contrairement à cette réponse, le formulaire Emacs et le formulaire Vim sont 100% compatibles avec python-docs-recommandation (car ils correspondent tous les deux à l'expression rationnelle - "match", par convention de longue date, signifie "match n'importe où dans le string ", contrairement à l'API de Python).<prefix>-*- var: value[; ...] -*-
.PEP 263:
Donc, "en coding: UTF-8 " correspond.
PEP fournit quelques exemples:
la source
Copiez simplement et collez l'instruction ci-dessous en haut de votre programme, cela résoudra les problèmes d'encodage de caractères
la source
À partir d'aujourd'hui - juin 2018
PEP 263 lui-même mentionne l'expression régulière qu'il suit:
Donc, comme déjà résumé par d'autres réponses, cela correspondra
coding
à n'importe quel préfixe, mais si vous souhaitez être aussi conforme à PEP que possible (même si, pour autant que je sache, utiliserencoding
au lieu decoding
ne viole pas PEP 263 de quelque manière que ce soit) - s'en tenir à «plain»coding
, sans préfixe.la source
Si je ne me trompe pas, la proposition originale pour les encodages de fichier source était d'utiliser une expression régulière pour les deux premières lignes, ce qui permettrait les deux.
Je pense que l'expression régulière était quelque chose du genre
coding:
suivi de quelque chose.J'ai trouvé ceci: http://www.python.org/dev/peps/pep-0263/ Quelle est la proposition originale, mais je n'arrive pas à trouver la spécification finale indiquant exactement ce qu'ils ont fait.
J'ai certainement utilisé
encoding:
avec beaucoup d'effet, donc évidemment cela fonctionne.Essayez de changer pour quelque chose de complètement différent, comme
duhcoding: ...
pour voir si cela fonctionne aussi bien.la source
Je soupçonne qu'il est similaire à Ruby - les deux méthodes sont acceptables.
Ceci est largement dû au fait que différents éditeurs de texte utilisent différentes méthodes (c'est-à-dire les deux) de marquage du codage.
Avec Ruby, tant que le premier, ou le second s'il y a une ligne shebang contient une chaîne qui correspond:
et en ignorant les espaces et autres peluches sur ces lignes. (Cela peut souvent être un = au lieu de: aussi).
la source