PEP 26 définit comment déclarer Python l'encodage du code source.
Normalement, les 2 premières lignes d'un fichier Python devrait commencer par:
#!/usr/bin/python
# -*- coding: <encoding name> -*-
Mais j'ai vu beaucoup de fichiers commençant par:
#!/usr/bin/python
# -*- encoding: <encoding name> -*-
=> codant au lieu de codant .
Alors, quelle est la bonne façon de déclarer le codage de fichier?
Est-ce que l'encodage est autorisé car l'expression régulière utilisée est paresseuse? Ou s'agit-il simplement d'une autre forme de déclaration du codage de fichier?
Je pose cette question car le PEP ne parle pas de codage , il ne parle que de codage .
Vérifiez la documentation 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
# -*- coding: <encoding-name> -*-
qui est également reconnu par GNU Emacs, et
# vim:fileencoding=<encoding-name>
reconnu par le VIM de Bram Moolenaar. "
Donc, vous pouvez mettre à peu près n'importe quoi avant la partie "codage", mais vous devez vous en tenir à "codage" (sans préfixe) si vous voulez être compatible à 100% avec python-docs-recommendation.
Plus précisément, vous devez utiliser tout ce qui est reconnu par Python et le logiciel d'édition que vous utilisez (si nécessaire). Par exemple, la forme coding
est reconnue (prête à l'emploi) par GNU Emacs mais pas Vim (oui, sans accord universel, c'est essentiellement un guerre de territoire ).
PEP 263:
la première ou la deuxième ligne doit correspondre à l'expression régulière "coding [: =]\s * ([-\w.] +)"
Alors, "encodage: UTF-8" allumettes.
PEP fournit quelques exemples:
#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
# This Python file uses the following encoding: utf-8
import os, sys
Il suffit de copier coller ci-dessous l'instruction en haut de votre programme. Cela résoudra les problèmes d'encodage des caractères.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
PEP 26 lui-même mentionne la regex qui suit:
Pour définir un codage de code source, un commentaire magique doit être placé dans les fichiers source en tant que première ou deuxième ligne du fichier, par exemple:
# coding=<encoding name>
ou (en utilisant des formats reconnus par les éditeurs populaires):
#!/usr/bin/python # -*- coding: <encoding name> -*-
ou:
#!/usr/bin/python # vim: set fileencoding=<encoding name> :
Plus précisément, la première ou la deuxième ligne doit correspondre à l'expression régulière suivante:
^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)
Donc, comme déjà résumé par d’autres réponses, cela fera correspondre coding
à n’importe quel préfixe, mais si vous souhaitez être aussi conforme à PEP que possible (même si, autant que je sache, utiliser encoding
au lieu de coding
ne viole en aucun cas PEP 263) - restez-y avec 'plain' coding
, sans préfixe.
Si je ne me trompe pas, la proposition initiale d'encodage du fichier source consistait à utiliser une expression régulière pour les deux premières lignes, ce qui autoriserait les deux.
Je pense que la regex était quelque chose du genre de 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 fait.
J'ai certainement utilisé encoding:
à bon escient, alors évidemment cela fonctionne.
Essayez de changer quelque chose de complètement différent, comme duhcoding: ...
pour voir si cela fonctionne aussi bien.
Je soupçonne que cela ressemble à Ruby - l'une ou l'autre méthode est acceptable.
Cela est dû en grande partie au fait que différents éditeurs de texte utilisent différentes méthodes (c’est-à-dire ces deux méthodes) d’encodage du marquage.
Avec Ruby, aussi longtemps que la première, ou la seconde s'il y a une ligne Shebang contient une chaîne qui correspond à:
coding: encoding-name
et en ignorant les espaces blancs et autres peluches sur ces lignes. (Cela peut souvent être un = au lieu de: aussi).