Правильный способ определения кодировки исходного кода Python


163

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

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

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

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

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

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

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

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

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


4
Кстати, для большей гибкости и мобильности рекомендуется использовать #!/usr/bin/env pythonвместо#!/usr/bin/python
glarrain

7
Мне нравится, что ни один из ответов на этой странице не имеет простого рабочего примера, скажем, UTF8. StackOverly во всей красе.
aaa90210

2
Я просто хотел добавить, что Python 3 изменил кодировку по умолчанию с asciiна UTF-8. Для сравнения: Python 2.7 документации с питона 3.7 Docs . Это означает, что вы можете смело пропустить эту кодировку, если хотите указать UTF-8.
gertvdijk

Ответы:


161

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

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

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

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

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

# vim:fileencoding=<encoding-name>

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

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

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


11
Почему то -*-?
Юлиан Онофрей

10
В -*-гарантирует , что линия признаваемый GNU Emacs (текстовый редактор популярным с некоторыми программистами). Обратите внимание, что, вопреки этому ответу, и форма Emacs, и форма Vim на 100% совместимы с python-docs-рекомендации (так как они оба соответствуют регулярному выражению regexp - «match», по давним соглашениям, означает «совпадать где угодно в строка ", в отличие от API Python).
Мартинс

1
Конкретные требования Emacs к встраиваемым директивам описаны на gnu.org/software/emacs/manual/html_node/emacs/… . Короче говоря, формат для начала файла: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev

38

ОПТОСОЗ 263:

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

Итак, «en coding: UTF-8 » соответствует.

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

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

 

# This Python file uses the following encoding: utf-8
import os, sys

31

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

3

На сегодня - июнь 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 в любом случае) - придерживайтесь «обычного» coding, без префиксов.


1

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

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

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

Я, конечно, привыкла encoding:к большому эффекту, так что, очевидно, это работает.

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


0

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

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

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

coding: encoding-name

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.