SyntaxError:函数返回“£”时文件中的非 ASCII 字符“\xa3”
Posted
技术标签:
【中文标题】SyntaxError:函数返回“£”时文件中的非 ASCII 字符“\\xa3”【英文标题】:SyntaxError: Non-ASCII character '\xa3' in file when function returns '£'SyntaxError:函数返回“£”时文件中的非 ASCII 字符“\xa3” 【发布时间】:2012-05-22 07:24:30 【问题描述】:假设我有一个函数:
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__'
部分中。
【问题讨论】:
您是否阅读了您链接到的 PEP?它描述了问题是什么以及如何解决它。 “谁能告诉我如何在我的返回函数中包含一个井号。”好吧,错误消息说“有关详细信息,请参阅python.org/peps/pep-0263.html”;也许你应该从那里开始? @murgatroid99 这就是你和我输入这 27 个人时缺少的内容:是的,我当然会阅读 PEP。难度级别:我试图在 docker 容器上运行 /bin/sh。我并没有公开尝试运行 Python。因此,PEP 将告诉我的所有内容是如何修复我不想运行且没有编写的 python 代码。我希望从 *** 获得更多的背景信息,而不是沾沾自喜。 :( 进一步搜索找到了实际答案:***.com/questions/38992850/… - 请注意 PEP 是如何做到零帮助的。 @MarkAllen - 在您的链接答案中,错误消息表明 python 正在尝试解释“/bin/bash” - 诚然,这很容易被忽视,但在 this中没有任何内容> 问题表明它与 docker 或容器有关,因此您在这里找到的建议不适用于您的问题 - 这不是自鸣得意,只是您的问题中有上下文,这里不存在。 @tanantish 我坚持我所说的。我得到了问题中的错误。与其给遇到这种情况的人提供有用的信息,不如说“你有没有读过你链接到的 PEP?”并且,“嗯,错误信息说见(废话),也许你应该从那里开始?” 【参考方案1】:在我的 .py 脚本顶部添加以下两行对我有用(第一行是必要的):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
【讨论】:
我遇到了同样的问题,我的 Python 是 2.7.11。将第二行# -*- coding: utf-8 -*-
添加到文件顶部后,问题解决了。
第一行是使 py 文件在 *nix 上可执行。它与这个问题并没有真正的关系。
当然,如果文件的实际编码不是 UTF-8,这根本没有帮助,就像这里的情况一样。【参考方案2】:
在脚本中添加以下两行为我解决了这个问题。
# !/usr/bin/python
# coding=utf-8
希望对你有帮助!
【讨论】:
这有效地复制了 2013 年的早期答案。在第一行的 shebang 中确切放置的内容在某种程度上取决于系统,但超出了此处讨论的范围。 另外,#
和 !
之间不能有空格【参考方案3】:
错误消息会告诉您究竟出了什么问题。 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 character-encoding 标记有一个 tag info page,其中包含更多信息和一些故障排除提示。
总之,在 7 位 ASCII 范围 (0x00-0x7F) 之外,Python 不能也不能猜测字节序列代表什么字符串。 https://tripleee.github.io/8bit#a3 显示了对字节 0xA3 的 21 种可能的解释,这仅来自传统的 8 位编码;但它也很可能是多字节编码的第一个字节。但事实上,我猜你实际上是在使用 Latin-1,所以你应该有
# coding: latin-1
作为源文件的第一行或第二行。无论如何,如果不知道字节应该代表哪个字符,人类也无法猜到这一点。
警告:coding: latin-1
肯定会删除错误消息(因为在此编码中没有技术上不允许的字节序列),但如果实际编码是某种东西,则在解释代码时可能会产生完全错误的结果别的。声明编码时,您确实必须完全确定文件的编码。
【讨论】:
这是对我之前对重复问题的回答的改编:***.com/a/50829958/874188 Python 3 默认对源文件使用 UTF-8,而且你现在可能应该对所有东西都使用 UTF-8。 utf8everywhere.org【参考方案4】:您可能正在尝试使用 Python 2 解释器运行 Python 3 文件。目前(截至 2019 年),python
命令在安装两个版本时默认使用 Python 2,在 Windows 和大多数 Linux 发行版上。
但如果您确实在使用 Python 2 脚本,本页尚未提及的解决方案是以 UTF-8+BOM 编码重新保存文件,这将在文件开头添加三个特殊字节,它们将明确地通知 Python 解释器(和您的文本编辑器)有关文件编码的信息。
【讨论】:
UTF-8 中的 BOM 令人讨厌,尽管它们在 Windows 上经常是必需的。【参考方案5】:首先将# -*- coding: utf-8 -*-
行添加到文件的开头,然后将u'foo'
用于所有非ASCII unicode 数据:
def NewFunction():
return u'£'
或使用自 Python 2.6 以来可用的魔法使其自动化:
from __future__ import unicode_literals
【讨论】:
如果你有# -*- coding: utf-8 -*-
,你不需要在你的unicode字符串前面加上u
@plaes 如果它在变量上怎么办?例如通过读取文件?我不能使用 uVariable,我该怎么做?
@DanielLee 但这不是真的。 # -*- coding: utf-8 -*-
后跟 print 'błąd'
将输出垃圾,而 print u'błąd'
有效。
@DanielLee Przemek D 所说的。像这样将 UTF-8 文字放入源代码通常不是一个好主意,并且可能导致不良行为,尤其是在 Python 2 中。如果文字不是纯 7 位 ASCII,它们应该是实际的 Unicode,而不是 UTF-8,所以在 Python 2 中,你应该在这些文字上加上 u
前缀。在 Python 3 中,纯字符串无论如何都是 Unicode,但在 Python 3 的最新版本中允许使用 u
前缀,以便更容易编写在 Python 2 和 3 中都能正常运行的代码。
@Skizo-ozᴉʞS 这个特定的错误消息(在这个问题的标题中)在这两种情况下都不会发生。一般来说,您需要指定您读取的任何文件的编码,如果您想将某些内容打印到使用特定编码的设备,同样指定编码或在您写入时手动转换。 Python 3 大大简化了这一点,尽管仍然存在必须明确指定编码的极端情况。或许也可以看看nedbatchelder.com/text/unipain.html【参考方案6】:
我建议您阅读 PEP 的错误信息。问题是您的代码正在尝试使用 ASCII 编码,但井号不是 ASCII 字符。尝试使用 UTF-8 编码。您可以先将 # -*- coding: utf-8 -*-
放在 .py 文件的顶部。为了更高级,您还可以在代码中逐个字符串定义编码。但是,如果您尝试将井号文字放入您的代码中,则需要一个支持整个文件的编码。
【讨论】:
以上是关于SyntaxError:函数返回“£”时文件中的非 ASCII 字符“\xa3”的主要内容,如果未能解决你的问题,请参考以下文章
Jquery File Upload SyntaxError: JSON.parse: JSON 数据后出现意外的非空白字符
SyntaxError: 以 '\x91' 开头的非 UTF-8 代码