关于python:SyntaxError:函数返回’£’时文件中的非ASCII字符’£’

SyntaxError: Non-ASCII character 'xa3' in file when function returns '£'

假设我有一个功能:

1
2
def NewFunction():
    return '£'

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

1
2
SyntaxError: Non-ASCII character '\xa3' in file 'blah' but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details

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


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


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

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


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

1
2
def NewFunction():
    return u'£'

或者使用自python 2.6以来可用的魔法使其自动:

1
from __future__ import unicode_literals


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

如果你想退回U+00A3,你可以说

1
return u'\u00a3'

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

1
return b'\xa3'

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

错误消息中链接的PEP将指导您如何准确地告诉python"这个文件不是纯ASCII;这里是我使用的编码"。如果编码是utf-8,那就是

1
# coding=utf-8

或Emacs兼容

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

如果您不知道编辑器使用哪种编码来保存此文件,可以使用十六进制编辑器和一些谷歌搜索来检查它。堆栈溢出字符编码标记有一个标记信息页,其中包含更多信息和一些疑难解答提示。

换句话说,在7位ASCII范围(0x00-0x7f)之外,python不能也不能猜测字节序列代表的字符串。https://triplee.github.io/8bit a3显示了21个字节0xa3的可能解释,这仅来自传统的8位编码;但它也很可能是多字节编码的第一个字节。但事实上,我猜你实际上使用的是拉丁语-1,所以你应该

1
# coding: latin-1

作为源文件的第一行或第二行。不管怎样,如果不知道字节应该代表哪一个字符,人类也无法猜测这一点。