какой кодирования декларации я должен вводить в Python - PullRequest
7 голосов
/ 26 ноября 2011

Из веб-сайта я узнал, что я должен добавить объявление кода в python, когда я не хочу вводить дружественные символы Юникода: http://www.python.org/dev/peps/pep-0263/,, но я все еще чувствую растерянность по этому поводу.

Предположим, что я работаю в Linux с vim, и я создаю новый файл py и вводим коды следующим образом:

#!/usr/bin/python2.7
# -*- coding: utf8 -*-
s = u'ޔ'
print s

1 . Я попытался заменить строку 2 кодами следующим образом:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

но это не работает, не так ли?

2 . Я не очень знаком с Linux, я действительно не знаю, почему я должен добавить _*_ в начале и конце кода, и когда я попытался заменить # -*- coding: utf8 -*- на # code=utf8 или # code: utf8, я получил ошибку :

File "pythontest.py", line 3
SyntaxError: Non-ASCII character '\xde' in file pythontest.py on line 3, but no encoding declared; see     http://www.python.org/peps/pep-0263.html for details

но эти декларации кодов упоминаются на сайте http://www.python.org/dev/peps/pep-0263/!

и согласно документации допускается объявление кода следующим образом:

# This Python file uses the following encoding: utf-8

Упс, что это? Я не думаю, что это может быть распознано компьютером. Что в мире должен объявить код? Я чувствую себя все более и более смущенным.

Спасибо за помощь.

Ответы [ 4 ]

3 голосов
/ 26 ноября 2011

Резюме PEP, на которое вы ссылаетесь, действительно говорит само за себя:

В этом PEP предлагается ввести синтаксис для объявления кодировки исходный файл Python . Информация о кодировании тогда используется Анализатор Python для интерпретации файла с использованием заданной кодировки. Наиболее в частности, это улучшает интерпретацию литералов Unicode в исходный код и позволяет писать литералы Unicode используя, например, UTF-8 непосредственно в редакторе, поддерживающем Unicode.

(акцент мой).

Даже если бы то, что вы хотели сделать, работало бы (заменяя кодировку исходного файла программно), это не имело бы никакого смысла. Подумайте об этом: код статичен (не меняется). Не имеет смысла пытаться читать его с другой кодировкой: есть только одна правильная (та, в которой автор источника отредактировал источник).

Что касается синтаксиса:

# This Python file uses the following encoding: utf-8

сам PEP говорит, что этот синтаксис: «Без строки интерпретатора, с использованием простого текста» . Он размещен там для людей. Так что, если вы откроете файл в текстовом редакторе и обнаружите, что он полон бессмысленности, вы можете вручную установить кодировку источника в его меню.

РЕДАКТИРОВАТЬ: Что касается того, почему вы должны установить кодировку между # -*- и -*- ... Это чисто условно. Первый символ, знак хеша, говорит, что это комментарий (поэтому он не будет скомпилирован в байт-код), тогда _*_ - это просто способ сообщить парсеру, что этот конкретный комментарий для него / нее.

Это ничем не отличается от ввода вашего источника:

# TODO: fix this nasty bug

, в котором часть TODO: сообщает разработчику (и некоторой IDE), что это сообщение требует действия. Вы могли бы действительно использовать все, что захотите, включая @MarkZar или WTF! ... просто соглашение!

НТН!

3 голосов
/ 26 ноября 2011

Важной частью объявления кодировки python является coding: utf-8, и она должна быть в комментарии перед первой строкой кода Python, и вы можете делать все, что захотите, с другой частью комментария.

Вот строки в PEP, описывающие это поведение:

Точнее, первая или вторая строка должна соответствовать обычной выражение "кодирование [: =] \ s * ([- \ w.] +)". Первая группа этого выражение затем интерпретируется как имя кодировки. Если кодировка Python неизвестен, во время компиляции возникает ошибка. Там не должно быть каких-либо операторов Python в строке, содержащей декларация кодировки.

0 голосов
/ 02 сентября 2017

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

  • найдите точную строку coding= или coding:, за которой следуют ноль или более пробелов, после чего следует хотя бы один буквенно-цифровой символ, _ или -.

  • захватить пробег хотя бы одного ...

  • захваченная часть используется в качестве кодировки.

То есть совершенно законно использовать что-либо вроде

# This program was written for Python 3. Encoding that should be used for decoding: UTF-8!

потому что строка в требуемом формате все еще может быть найдена там .


В исходных файлах Python 3 по умолчанию используется кодировка UTF-8, поэтому в коде Python 3 не требуется # coding: utf-8, пока вы используете UTF-8.

0 голосов
/ 26 ноября 2011

Вам нужна строка, так как вы должны сообщить компилятору , какую кодировку использует исходный код.

...