Python 语法错误:非ASCII字符'\xa3&x27;当函数返回'£';

Python 语法错误:非ASCII字符'\xa3&x27;当函数返回'£';,python,unicode,python-unicode,character-encoding,Python,Unicode,Python Unicode,Character Encoding,假设我有一个函数: def NewFunction(): return '£' 我想打印一些前面有磅符号的东西,它会打印一个错误。当我尝试运行此程序时,会显示此错误消息: SyntaxError:文件“blah”中的非ASCII字符“\xa3”,但未声明编码; 看见http://www.python.org/peps/pep-0263.html 详情 有人能告诉我如何在返回函数中包含一个磅符号吗?我基本上是在一个类中使用它,它在包含磅符号的“str”部分中。我建议阅读错误给你的PEP

假设我有一个函数:

def NewFunction():
    return '£'
我想打印一些前面有磅符号的东西,它会打印一个错误。当我尝试运行此程序时,会显示此错误消息:

SyntaxError:文件“blah”中的非ASCII字符“\xa3”,但未声明编码;
看见http://www.python.org/peps/pep-0263.html 详情

有人能告诉我如何在返回函数中包含一个磅符号吗?我基本上是在一个类中使用它,它在包含磅符号的
“str”
部分中。

我建议阅读错误给你的PEP。问题是您的代码试图使用ASCII编码,但英镑符号不是ASCII字符。尝试使用UTF-8编码。首先,您可以将
#-*-coding:utf-8-*-
放在.py文件的顶部。为了更高级,您还可以在代码中逐个字符串地定义编码。但是,如果您试图将磅符号文字放入代码中,则需要对整个文件提供支持的编码。

首先在文件开头添加
#-*-编码:utf-8-*-
行,然后对所有非ASCII unicode数据使用
u'foo'

def NewFunction():
    return u'£'
或者使用自Python 2.6以来提供的魔法使其自动化:

from __future__ import unicode_literals

在我的.py脚本顶部添加以下两行对我很有用(第一行是必需的):


错误消息会准确地告诉您出了什么问题。Python解释器需要知道非ASCII字符的编码

如果你想回来,你可以说

return u'\u00a3'
它通过Unicode转义序列以纯ASCII表示此字符。如果要返回包含文本字节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不能也不应该猜测字节序列代表的字符串。显示了字节0xA3的21种可能解释,这仅来自传统的8位编码;但它也很可能是多字节编码的第一个字节。但事实上,我猜你实际上在用拉丁语-1,所以你应该

# coding: latin-1
作为源文件的第一行或第二行。不管怎么说,如果不知道字节应该代表哪个字符,人类也无法猜出这一点


警告:
coding:latin-1
肯定会删除错误消息(因为在此编码中没有技术上不允许的字节序列),但如果实际编码是其他编码,则在解释代码时可能会产生完全错误的结果。声明编码时,您确实必须完全确定文件的编码。

您可能正在尝试使用Python 2解释器运行Python 3文件。目前(从2019年起),在Windows和大多数Linux发行版上安装这两个版本时,
python
命令默认为python2


但如果您确实在使用Python 2脚本,本页中尚未提到的解决方案是以UTF-8+BOM编码重新保存文件,这将在文件开头添加三个特殊字节,它们将明确通知Python解释器(以及您的文本编辑器)关于文件编码。

在脚本中添加以下两行解决了我的问题

# !/usr/bin/python
# coding=utf-8

希望有帮助

你看过你链接的政治公众人物吗?它描述了问题是什么以及如何解决。“有人能告诉我如何在返回函数中包含一个磅符号吗?”错误消息说“请参阅以获取详细信息”;也许你应该从这里开始?@murgatroid99这是你和我打这封信的时候,其他27封信不见了:是的,我当然会读政治公众人物。难度等级:我在对docker容器运行/bin/sh时遇到了这个问题。我没有公开尝试运行Python。所以PEP要告诉我的就是如何修复我不想运行也没有编写的python代码。我原本希望从StackOverflow中获得更多的上下文,结果却自命不凡(进一步搜索得到了实际答案:-请注意PEP如何准确地为零提供帮助。@MarkAllen-在链接的答案中,错误消息表示python正在试图解释“/bin/bash”-诚然,这是一件容易忽视的事情,但这个问题中没有任何东西表明这与码头工人或集装箱有关,因此,你发现这里的建议不适用于你的问题-这不是自命不凡,只是你的问题中有上下文,而这在这里并不存在。@tanantish我坚持我所说的。我在问题中犯了错误。与其给这些人提供有用的信息,不如说“你读过你链接的政治公众人物了吗?”和“错误消息说请看(废话),你应该从那里开始。”如果你有
#-*-编码:utf-8-*-
你不需要在unicode字符串前面加上
u
@plaes,如果它在变量上呢?例如通过读取文件?我不能使用uVariable,我怎么做?@Danielle,除非这不是真的。
#-*-编码:utf-8-*-
后跟
打印'błd'
将输出garbage、 而
print u'błąd'
是有效的。@Danielle Przemek d所说的。像这样将UTF-8文本放入源代码通常不是一个好主意,并且可能导致不必要的行为,尤其是在Python 2中。如果文本不是纯7
# !/usr/bin/python
# coding=utf-8