303

说我有一个功能:

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__'包含井号的部分内。

4

6 回答 6

382

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

于 2012-05-14T19:16:26.153 回答
337

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

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
于 2013-11-06T09:29:23.467 回答
59

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

def NewFunction():
    return u'£'

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

from __future__ import unicode_literals
于 2012-05-14T19:21:26.923 回答
12

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

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

希望能帮助到你 !

于 2019-12-06T08:52:52.053 回答
12

错误消息会告诉您究竟出了什么问题。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 位编码;但它也很可能是多字节编码的第一个字节。但事实上,我猜你实际上是在使用 Latin-1,所以你应该有

# coding: latin-1

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

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

于 2018-06-13T07:43:49.070 回答
6

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

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

于 2019-08-28T13:56:06.407 回答