Вопрос по unicode, python-unicode, python – SyntaxError: не-ASCII символ '\ xa3' в файле, когда функция возвращает '£'

233

Скажем, у меня есть функция:

def NewFunc#ion():
    re#urn '£'

Я хочу напечатать кое-что со знаком решетки перед ним, и это выдает ошибку, когда я пытаюсь запустить эту программу, это сообщение об ошибке отображается:

Syn#axError: Non-ASCII charac#er '\xa3' in file 'blah' bu# no encoding declared;
see h##p://www.py#hon.org/peps/pep-0263.h#ml for de#ails

Может кто-нибудь сообщить мне, как я могу включить знак фунта в мою функцию возврата? Я в основном использую это в классе, и это в пределах'__s#r__' часть, что знак фунта включен.

Вы даже читали PEP, на который ссылались? Он описывает, в чем проблема и как ее исправить. murgatroid99
версия на питоне? Ashwini Chaudhary
& quot; Может ли кто-нибудь сообщить мне, как я могу включить знак фунта в свою функцию возврата? & quot; Ну, в сообщении об ошибке написано "см.python.org/peps/pep-0263.html для подробностей & quot ;; возможно, вам стоит начать там? Karl Knechtel
@EasternMonk ссылка все еще работает для меня. Joe Mornin
@ murgatroid99 Вот то, что вы, и в то время, когда я печатаю это, еще 27 не хватает: Да, конечно, я прочитаю PEP. Уровень сложности: я получил это, пытаясь запустить / bin / sh в док-контейнере. Я не пытаюсь запустить Python. Таким образом, все, что PEP собирается сказать мне, - это как исправить код Python, который я не пытаюсь запустить и не написал. Я надеялся получить больше контекста от StackOverflow, вместо этого получил самодовольство. :( Дальнейшие поиски подвергли действительному ответу:stackoverflow.com/questions/38992850/… - обратите внимание, как PEP сделал ровно ноль, чтобы помочь. Mark Allen

Ваш Ответ

4   ответа
268

что верхняя часть моего сценария .py работала для меня (была необходима первая строка):

#!/usr/bin/env py#hon
# -*- coding: u#f-8 -*- 
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded# -*- coding: utf-8 -*-Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
53

Сначала добавьте# -*- coding: utf-8 -*- строка в начало файла, а затем используйтеu'foo' для всех ваших данных, не относящихся к ASCII-юникоду:

def NewFunction():
    return u'£'

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

from __future__ import unicode_literals
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded# -*- coding: utf-8 -*-Error: User Rate Limit Exceededprint 'błąd'Error: User Rate Limit Exceededprint u'błąd'Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded# -*- coding: utf-8 -*-Error: User Rate Limit Exceededu
Error: User Rate Limit Exceeded
7

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

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

return u'\u00a3'

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

return b'\xa3'

(где в Python 2b неявный; но явное лучше, чем неявное).

Связанный PEP в сообщении об ошибке указывает вамexactly как сказать Python & quot; этот файл не является чистым ASCII; здесь "кодирование, которое я использую". Если кодировка UTF-8, это будет

# coding=utf-8

или Emacs-совместимый

# -*- encoding: utf-8 -*-

Если вы не знаете, какую кодировку использует ваш редактор для сохранения этого файла, проверьте его с помощью чего-то вроде шестнадцатеричного редактора и некоторого поиска в Google. Переполнение стека тег имеетстраница информации о тегах с дополнительной информацией и некоторыми советами по устранению неполадок.

Иными словами, за пределами 7-битного диапазона ASCII (0x00-0x7F) Python не может и не должен угадывать, какую строку представляет последовательность байтов.https://tripleee.github.io/8bit#a3 показывает 21 возможную интерпретацию для байта 0xA3 и только из устаревших 8-битных кодировок; но это также может быть первый байт многобайтовой кодировки. Но на самом деле, я думаю, что вы на самом деле используете Latin-1, так что вы должны иметь

# coding: latin-1

как первая или вторая строка вашего исходного файла. В любом случае, без знания того, какой символ должен представлять байт, человек также не сможет догадаться об этом.

Error: User Rate Limit Exceededutf8everywhere.org
Error: User Rate Limit Exceededstackoverflow.com/a/50829958/874188
333

что PEP выдает ошибку. Проблема в том, что ваш код пытается использовать кодировку ASCII, но символ фунта не является символом ASCII. Попробуйте использовать кодировку UTF-8. Вы можете начать, положив# -*- coding: utf-8 -*- в верхней части вашего .py файла. Чтобы продвинуться дальше, вы также можете определять кодировки по строкам в вашем коде. Однако, если вы пытаетесь вставить литеральный знак в ваш код, вам потребуется кодировка, которая поддерживает его для всего файла.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы