SyntaxError:函数返回'£'时文件中的非ASCII字符'\ xa3'

时间:2012-05-14 19:12:25

标签: python unicode python-unicode

说我有一个功能:

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__'部分内,包括英镑符号。

6 个答案:

答案 0 :(得分:344)

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

答案 1 :(得分:276)

添加以下两行,我的.py脚本的顶部为我工作(第一行是必要的):

#!/usr/bin/env python
# -*- coding: utf-8 -*- 

答案 2 :(得分:54)

首先将# -*- coding: utf-8 -*-行添加到文件的开头,然后将u'foo'用于所有非ASCII unicode数据:

def NewFunction():
    return u'£'

或使用自Python 2.6以来可用的魔术使其自动化:

from __future__ import unicode_literals

答案 3 :(得分:9)

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

如果您想返回U+00A3,那么您可以说

return u'\u00a3'

通过Unicode转义序列以纯ASCII表示此字符。如果要返回包含文字字节0xA3的字节字符串,那就是

return b'\xa3'

(在Python 2中,b是隐式的;但显式优于隐式)。

错误消息中的链接PEP指示您完全如何告诉Python“此文件不是纯ASCII;这是我正在使用的编码”。如果编码是UTF-8,那将是

# coding=utf-8

或与Emacs兼容的

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

如果您不知道编辑器使用哪种编码来保存此文件,请使用十六进制编辑器和一些Google搜索来检查它。 Stack Overflow 标记包含tag info page,其中包含更多信息和一些疑难解答提示。

在7位ASCII范围(0x00-0x7F)之外的许多词中,Python不能也不能猜测字节序列代表什么字符串。 https://tripleee.github.io/8bit#a3显示了对字节0xA3的21种可能的解释,并且仅来自传统的8位编码;但它也可能是多字节编码的第一个字节。但实际上,我猜你实际上是在使用Latin-1,所以你应该有

# coding: latin-1

作为源文件的第一行或第二行。无论如何,在不知道字节应该代表哪个字符的情况下,人类也无法猜测这一点。

答案 4 :(得分:1)

在脚本中添加以下两行为我解决了这个问题。

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

希望有帮助!

答案 5 :(得分:0)

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

但是,如果您确实正在使用Python 2脚本,则此页面上尚未提及的解决方案是将文件重新保存为UTF-8 + BOM编码,这会将三个特殊字节添加到文件的开头,它们会明确告知Python解释器(和您的文本编辑器)有关文件编码的信息。