语法错误:函数返回“£”时文件中的非ASCII字符“ \ xa3”


283

说我有一个功能:

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


42
您甚至没有阅读您链接到的PEP?它描述了问题所在以及如何解决。
murgatroid99 2012年

2
“有人能告诉我如何在返回函数中加入井号吗?” 好吧,错误消息显示为“有关详细信息,请参见python.org/peps/pep-0263.html ”;也许你应该从那里开始?
Karl Knechtel

5
@ murgatroid99这就是您以及在我键入此内容时所缺少的27个人:当然,我会阅读PEP。难度级别:我试图在docker容器上运行/ bin / sh。我并不是很想尝试运行Python。因此,PEP只会告诉我如何修复我不尝试运行且未编写的python代码。我希望从StackOverflow获得更多上下文,而变得自鸣得意。:(进一步搜索打开了实际的答案:stackoverflow.com/questions/38992850/... -通知PEP是如何做到精确为零的帮助。
马克·艾伦

@MarkAllen-在链接的答案中,错误消息指示python正在尝试解释“ / bin / bash”-公认很容易忽略,但是问题中没有任何内容表明与docker或容器有关,因此建议您在这里发现的内容不适用于您的问题-这不是自鸣得意,只是您的问题中存在上下文,此处不存在。
Tanantish

@tanantish我坚持我所说的。我得到了问题中的错误。与其提供有用的信息,不如说:“您甚至没有阅读链接到的PEP?” 并且,“错误消息说(瞧),也许您应该从那里开始?” <-这些答复没有帮助。我不确定为什么要进行此讨论。
Mark Allen

Answers:


367

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


305

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

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

我遇到了同样的问题,我的Python是2.7.11。将第二行添加# -*- coding: utf-8 -*-到文件顶部后,它解决了该问题。
hailong 2016年

2
第一行是使py文件在* nix上可执行。它与这个问题并没有真正的关系。
cmd

57

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

def NewFunction():
    return u'£'

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

from __future__ import unicode_literals

12
如果您有# -*- coding: utf-8 -*-,则无需在unicode字符串前添加前缀u
Daniel Lee

@plaes如果在变量上怎么办?例如通过读取文件?我不能使用uVariable,我该怎么做?
Skizo-ozᴉʞS

1
@DanielLee除非这不是事实。# -*- coding: utf-8 -*-其次print 'błąd'将输出垃圾,而print u'błąd'工作。
Przemek D

@DanielLee Przemek D说了什么。像这样将UTF-8文字放入您的源代码中通常不是一个好主意,并且可能导致不必要的行为,尤其是在Python 2中。如果文字不是纯7位ASCII,则它们应该是实际的Unicode,而不是UTF-8,因此在Python 2中,您应该u在此类文字上加上前缀。在Python 3,普通字符串都是Unicode反正,但u前缀最新版本的Python 3,使其编写代码更容易一些的Python 2&3,正确的行为均是允许的
PM 2Ring

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 -*-

如果您不知道编辑器使用哪种编码来保存此文件,请使用十六进制编辑器和某种谷歌搜索来检查它。堆栈溢出标签有一个标签信息页面,其中包含更多信息和一些故障排除提示。

用这么多的词来说,超出7位ASCII范围(0x00-0x7F)的地方,Python不能也不应该猜测字节序列代表什么字符串。https://tripleee.github.io/8bit#a3显示了字节0xA3的21种可能的解释,而这仅来自传统的8位编码;但也可能是多字节编码的第一个字节。但实际上,我想您实际上正在使用Latin-1,因此您应该

# coding: latin-1

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

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


这是我对一个重复问题的较早答案的改编:stackoverflow.com/a/50829958/874188
Tripleee

对于源文件,Python 3默认为UTF-8,无论如何,您现在应该将UTF-8用于所有内容。utf8everywhere.org
Tripleee '18


2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.