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 содержит страницу информации о теге с дополнительной информацией и некоторыми советами по устранению неполадок.

Во многих словах, за пределами 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 (и вашему текстовому редактору) о кодировке файла.