假设我有一个函数

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__'部分中,包含了磅号。


I'd recommend reading that PEP the error gives you. The problem is that your code is trying to use the ASCII encoding, but the pound symbol is not an ASCII character. Try using UTF-8 encoding. You can start by putting # -*- coding: utf-8 -*- at the top of your .py file. To get more advanced, you can also define encodings on a string by string basis in your code. However, if you are trying to put the pound sign literal in to your code, you'll need an encoding that supports it for the entire file.


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

def NewFunction():
    return u'£'

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

from __future__ import unicode_literals

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

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

错误消息会告诉您哪里出了问题。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 -*-

如果您不知道您的编辑器使用哪种编码来保存该文件,可以使用十六进制编辑器和一些谷歌搜索来检查它。Stack Overflow字符编码标记有一个标记信息页面,其中包含更多信息和一些故障排除技巧。

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

# coding: latin-1

作为源文件的第一行或第二行。无论如何,如果不知道字节应该表示哪个字符,人类也无法猜到这一点。

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


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

但如果你确实在Python 2脚本上工作,这个页面上还没有提到的解决方案是用UTF-8+BOM编码重新保存文件,这将在文件的开头添加三个特殊字节,它们将显式地通知Python解释器(和你的文本编辑器)文件编码。


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

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

希望能有所帮助!