假设我有一个函数

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


当前回答

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

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

其他回答

错误消息会告诉您哪里出了问题。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解释器(和你的文本编辑器)文件编码。

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

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

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

def NewFunction():
    return u'£'

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

from __future__ import unicode_literals

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

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

希望能有所帮助!