SyntaxError: символ не-ASCII '\ xa3' в файле, когда функция возвращает '£'
Скажем, у меня есть функция:
def NewFunction():
return '£'
Я хочу напечатать некоторые вещи с значком фунта перед ним, и он печатает ошибку, когда я пытаюсь запустить эту программу, это сообщение об ошибке отображается:
SyntaxError: Non-ASCII character '\xa3' in file 'blah' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details
Может ли кто-нибудь сообщить мне, как я могу включить знак фунта в мою функцию возврата? Я в основном использую его в классе и в части '__str__'
, в которую включен знак фунта.
Ответы
Ответ 1
Я бы рекомендовал прочитать этот PEP, который дает вам ошибка. Проблема в том, что ваш код пытается использовать кодировку ASCII, но символ фунта не является символом ASCII. Попробуйте использовать кодировку UTF-8. Вы можете начать с размещения # -*- coding: utf-8 -*-
в верхней части вашего .py файла. Чтобы получить более продвинутые функции, вы также можете определить кодировки в строке по строкам в коде. Однако, если вы пытаетесь помещать буквенный знак буква в свой код, вам понадобится кодировка, которая поддерживает его для всего файла.
Ответ 2
Добавление двух следующих строк: моя работа над моей .py script (первая строка была необходима):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
Ответ 3
Сначала добавьте строку # -*- coding: utf-8 -*-
в начало файла, а затем используйте u'foo'
для всех ваших данных Unicode, отличных от ASCII:
def NewFunction():
return u'£'
или используйте магию, доступную с Python 2.6, чтобы сделать ее автоматической:
from __future__ import unicode_literals
Ответ 4
Сообщение об ошибке говорит вам, что именно не так. Интерпретатору Python необходимо знать кодировку не-ASCII символа.
Если вы хотите вернуть U + 00A3, вы можете сказать
return u'\u00a3'
который представляет этот символ в чистом ASCII посредством escape-последовательности Unicode. Если вы хотите вернуть байтовую строку, содержащую буквенный байт 0xA3, это
return b'\xa3'
(где в Python 2 b
неявный; но явный лучше, чем неявный).
Связанный PEP в сообщении об ошибке объясняет, как именно сказать Python: "Этот файл не является чистым ASCII; здесь используется кодировка, которую я использую". Если кодировка UTF-8, это будет
# coding=utf-8
или Emacs-совместимый
# -*- encoding: utf-8 -*-
Если вы не знаете, какую кодировку использует ваш редактор для сохранения этого файла, проверьте его с помощью чего-то вроде шестнадцатеричного редактора и некоторого поиска в Google. Тег Qaru character-encoding содержит страницу информации о теге с дополнительной информацией и некоторыми советами по устранению неполадок.
Во многих словах, за пределами 7-битного диапазона ASCII (0x00-0x7F), Python не может и не должен угадывать, какую строку представляет последовательность байтов. https://tripleee.github.io/8bit#a3 показывает 21 возможную интерпретацию для байта 0xA3 и только из устаревших 8-битных кодировок; но это также может быть первый байт многобайтовой кодировки. Но на самом деле, я предполагаю, что вы на самом деле используете Latin-1, поэтому вы должны иметь
# coding: latin-1
как первая или вторая строка вашего исходного файла. В любом случае, без знания того, какой символ должен представлять байт, человек также не сможет догадаться об этом.
Предостережение: coding: latin-1
определенно удалит сообщение об ошибке (потому что нет никаких последовательностей байтов, которые технически не разрешены в этой кодировке), но может привести к совершенно неправильному результату, когда код интерпретируется, если фактическая кодировка является чем-то другим. Вы действительно должны знать кодировку файла с полной уверенностью, когда вы объявляете кодировку.
Ответ 5
Вы, вероятно, пытаетесь запустить файл Python 3 с интерпретатором Python 2. В настоящее время (по состоянию на 2019 г.) команда python
по умолчанию установлена на Python 2, когда установлены обе версии, в Windows и большинстве дистрибутивов Linux.
Но в случае, если вы действительно работаете над сценарием Python 2, решение, которое еще не упомянуто на этой странице, состоит в том, чтобы сохранить файл в кодировке UTF-8 + BOM, который добавит три специальных байта в начало файла. явно сообщите интерпретатору Python (и вашему текстовому редактору) о кодировке файла.