"SyntaxError: Non-ASCII character ..." or "SyntaxError: Non-UTF-8 code starting with ..." trying to use non-ASCII text in a Python script
"SyntaxError: символ, отличный от ASCII ..." или "SyntaxError: код, отличный от UTF-8, начинающийся с ..." попытка использовать текст, отличный от ASCII, в скрипте Python
Я попробовал этот код на Python 2:
defNewFunction(): return'£'
Но я получаю сообщение об ошибке, в котором говорится:
SyntaxError: Non-ASCII character '\xa3'in file '...' but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Аналогично, в Python 3, если я напишу тот же код и сохраню его в кодировке Latin-1, я получу:
SyntaxError: Non-UTF-8 code starting with'\xa3'in file ... on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
Как я могу использовать знак фунта в строковых литералах в моем коде?
Смотрите также: Правильный способ определения кодировки исходного кода Python для получения подробной информации о том, нужно ли объявлять кодировку и как ее следует записывать. Пожалуйста, используйте этот вопрос, чтобы закрыть дубликаты, спрашивающие о том, как написать объявление, а этот - для вопросов об устранении ошибки.
Переведено автоматически
Ответ 1
Я бы рекомендовал прочитать сообщение об ошибке. Проблема в том, что ваш код пытается использовать кодировку ASCII, но символ фунта не является символом ASCII. Попробуйте использовать кодировку UTF-8. Вы можете начать с указания # -*- coding: utf-8 -*- в верхней части вашего файла .py. Чтобы продвинуться дальше, вы также можете определять кодировки в вашем коде построчно. Однако, если вы пытаетесь ввести в свой код литерал со знаком фунта, вам понадобится кодировка, поддерживающая его для всего файла.
Ответ 2
Добавление следующих двух строк в начало моего скрипта .py сработало для меня (первая строка была необходима):
#!/usr/bin/env python # -*- coding: utf-8 -*-
Ответ 3
Сначала добавьте # -*- coding: utf-8 -*- строку в начало файла, а затем используйте u'foo' для всех ваших данных, отличных от ASCII в формате unicode:
defNewFunction(): returnu'£'
или используйте магию, доступную с Python 2.6, чтобы сделать это автоматическим:
from __future__ import unicode_literals
Ответ 4
В сообщении об ошибке точно указано, что не так. Интерпретатору Python необходимо знать кодировку символа, отличного от ASCII.
Если вы хотите вернуть U + 00A3, вы можете сказать
returnu'\u00a3'
который представляет этот символ в чистом ASCII с помощью управляющей последовательности Unicode. Если вы хотите вернуть строку байтов, содержащую буквенный байт 0xA3, это
returnb'\xa3'
(где в Python 2 b является неявным; но явное лучше, чем неявное).
Связанный PEP в сообщении об ошибке точно указывает вам, как сообщить Python "этот файл не является чистым ASCII; вот кодировка, которую я использую". Если кодировка UTF-8, это будет
# coding=utf-8
или совместимый с Emacs
# -*- encoding: utf-8 -*-
Если вы не знаете, какую кодировку использует ваш редактор для сохранения этого файла, проверьте его с помощью чего-то вроде шестнадцатеричного редактора и немного погуглите. Тег Stack Overflow с кодировкой символов содержит страницу сведений о теге с дополнительной информацией и некоторыми советами по устранению неполадок.
Во многих словах, за пределами 7-битного диапазона ASCII (0x00-0x7F), Python не может и не должен угадывать, какую строку представляет последовательность байтов. https://tripleee.github.io/8bit#a3 показывает 21 возможную интерпретацию для байта 0xA3, и это только из устаревших 8-битных кодировок; но это также вполне может быть первым байтом многобайтовой кодировки. Но на самом деле, я бы предположил, что вы на самом деле используете Latin-1, поэтому у вас должно быть
# coding: latin-1
как первая или вторая строка вашего исходного файла. В любом случае, без знания того, какой символ должен представлять байт, человек также не сможет угадать это.
Предостережение: coding: latin-1 определенно удалит сообщение об ошибке (потому что нет байтовых последовательностей, которые технически не разрешены в этой кодировке), но может привести к совершенно неправильному результату при интерпретации кода, если фактическая кодировка является чем-то другим. Вам действительно нужно знать кодировку файла с полной уверенностью, когда вы объявляете кодировку.