Правильный способ определения кодировки исходного кода Python - PullRequest
144 голосов
/ 08 апреля 2009

PEP 263 определяет, как объявлять кодировку исходного кода Python.

Обычно первые 2 строки файла Python должны начинаться с:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

Но я видел много файлов, начинающихся с:

#!/usr/bin/python
# -*- encoding: <encoding name> -*-

=> кодировка вместо кодировка .

Так, как правильно объявить кодировку файла?

Разрешено ли кодирование , поскольку используемое регулярное выражение лениво? Или это просто еще одна форма объявления кодировки файла?

Я задаю этот вопрос, потому что PEP не говорит о кодировке , он просто говорит о кодировании .

Ответы [ 6 ]

151 голосов
/ 08 апреля 2009

Проверьте документы здесь :

"Если комментарий в первой или второй строке скрипта Python соответствует регулярному выражению coding[=:]\s*([-\w.]+), этот комментарий обрабатывается как объявление кодировки"

"Рекомендованные формы этого выражения:

# -*- coding: <encoding-name> -*-

, который также распознается GNU Emacs, и

# vim:fileencoding=<encoding-name>

, который признан VIM Брэма Муленаара. "

Итак, перед частью «кодирование» вы можете поместить что угодно, но придерживайтесь «кодирования» (без префикса), если хотите быть на 100% совместимым с python-docs-рекомендациями.

Точнее говоря, вам нужно использовать все, что распознается Python , и конкретное программное обеспечение для редактирования, которое вы используете (если оно нуждается / принимает что-либо вообще). Например. форма coding распознается (из коробки) GNU Emacs, но не Vim (да, без универсального соглашения, это по сути дерновая война ).

36 голосов
/ 08 апреля 2009

PEP 263:

первая или вторая строка должны совпадать регулярный выражение "coding [: =] \ s * ([- \ w.] +)"

Итак, "en кодирование: UTF-8 " соответствует.

PEP приводит несколько примеров:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

# This Python file uses the following encoding: utf-8
import os, sys
24 голосов
/ 22 марта 2016

Просто скопируйте оператор вставки ниже в верхней части вашей программы. Это решит проблемы с кодировкой символов

#!/usr/bin/env python
# -*- coding: utf-8 -*-
2 голосов
/ 25 июня 2018

На сегодня - июнь 2018


PEP 263 сам упоминает следующее регулярное выражение:

Чтобы определить кодировку исходного кода, необходимо поместить волшебный комментарий в исходные файлы в виде первой или второй строки файла, например:

# coding=<encoding name>

или (с использованием форматов, признанных популярными редакторами):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

или

#!/usr/bin/python
# vim: set fileencoding=<encoding name> : 

Точнее, первая или вторая строка должны соответствовать следующему регулярному выражению:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

Итак, как уже было указано в других ответах, он будет сопоставлять coding с любым префиксом, но если вы хотите быть настолько совместимым с PEP, насколько это возможно (хотя, насколько я могу судить, использование encoding вместо coding никак не нарушает PEP 263) - придерживайтесь «plain» coding, без префиксов.

1 голос
/ 08 апреля 2009

Если я не ошибаюсь, первоначальное предложение для кодировок исходного файла заключалось в использовании регулярного выражения для первой пары строк, что позволило бы и то и другое.

Я думаю, что регулярное выражение было чем-то вроде coding:, за которым следовало что-то.

Я нашел это: http://www.python.org/dev/peps/pep-0263/ Это оригинальное предложение, но я не могу найти окончательную спецификацию, в которой точно указано, что они сделали.

Я, конечно, использовал encoding: для большого эффекта, так что, очевидно, это работает.

Попробуйте перейти на что-то совершенно другое, например duhcoding: ..., чтобы увидеть, работает ли оно так же хорошо.

0 голосов
/ 08 апреля 2009

Я подозреваю, что это похоже на Ruby - любой метод в порядке.

Это в основном потому, что разные текстовые редакторы используют разные методы (т. Е. Эти два) для маркировки кодировки.

В Ruby, если первая или вторая, если есть строка Шебанга, содержит строку, которая соответствует:

coding: encoding-name

и игнорирование любых пробелов и других пухов в этих строках. (Это также может часто быть = вместо: тоже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...