Вопрос-Ответ

"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:

def NewFunction():
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:

def NewFunction():
return u'£'

или используйте магию, доступную с Python 2.6, чтобы сделать это автоматическим:

from __future__ import unicode_literals
Ответ 4

В сообщении об ошибке точно указано, что не так. Интерпретатору Python необходимо знать кодировку символа, отличного от ASCII.

Если вы хотите вернуть U + 00A3, вы можете сказать

return u'\u00a3'

который представляет этот символ в чистом ASCII с помощью управляющей последовательности Unicode. Если вы хотите вернуть строку байтов, содержащую буквенный байт 0xA3, это

return b'\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 определенно удалит сообщение об ошибке (потому что нет байтовых последовательностей, которые технически не разрешены в этой кодировке), но может привести к совершенно неправильному результату при интерпретации кода, если фактическая кодировка является чем-то другим. Вам действительно нужно знать кодировку файла с полной уверенностью, когда вы объявляете кодировку.

2023-12-13 07:54 python unicode