编译语法错误:字符串中的非ASCII字母

时间:2011-05-31 05:22:31

标签: python unicode compiler-errors ascii

我有一个python文件,其中包含一长串HTML。当我编译&运行此文件/脚本我收到此错误:

_SyntaxError: Non-ASCII character '\x92' in file   C:\Users...\GlobalVars.py on line 2509,   but no encoding declared; see http://www.python.org/peps/pep-0263.html for details_

我已按照说明进入建议的网址。但是在我的脚本顶部放置这样的东西仍然不起作用:

#!/usr/bin/python
# -*- coding: latin-1 -*-

您认为如何阻止此编译器错误发生?

7 个答案:

答案 0 :(得分:8)

首先,为了防止问题中指定的问题,你不应该永远使用除utf-8之外的其他编码来实现python源代码。

这是使用正确的标题

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

现在你必须将文件从你可能拥有的任何编码转换为utf-8,可能你当前的文本编辑器能够做到这一点。

如果你想知道我为什么这么说,请记住,文本编辑器不可能安全地猜测你的非unicode编码,因为非unicode没有BOM。出于这个原因,即使没有指定编码,大多数体面的编辑器都使用UTF-8作为默认值。而BTW,python文件头中指定的编码仅适用于Python,大多数编辑忽略了你在那里写的内容。

此外,正如您所看到的,Python正在尝试使用ASCII(而非latin-1)解码128以上的字符,这应该会失败。我不确定为什么会这样,但我甚至不在乎,因为有更好的方法来解决这个问题。

答案 1 :(得分:3)

它必须位于脚本的顶部,具有非ASCII文本,并且必须与文件的实际编码匹配。 \x92是CP1252,而不是Latin-1。

答案 2 :(得分:3)

如果你只关心摆脱这个错误而不了解它的细节(你可以从这个页面上的其他答案得到),你可以做以下事情 -

1)复制代码并将其粘贴到Notepad ++

2)选择编码 - >用UTF-8编码

3)选择查看 - >显示符号 - >显示所有字符

现在可以看到哪个符号导致问题(x92可见)。更换/删除它以解决问题。

答案 3 :(得分:2)

找到这个并希望它对下一个人有帮助: http://www.sitepoint.com/forums/showthread.php?567734-Anyone-know-what-this-error-means

  

代码点0x92(十进制146)是正确的单引号,或   Windows-1252中的撇号(')。这是ISO 8859中的无效字符   在UTF-8中,因为0x80-0x9F范围是为C1控制保留的   字符。

不确定我是否破坏了版权。如果是这样,请删除blockquote。

答案 4 :(得分:1)

编码声明表明你认为该文件是latin-1编码,但python解释器发现GlobalVars.py中的2509行或非常靠近第2509行的char不是你想象的那样。

您应首先确认GlobalVars.py的编码。它真的是拉丁语吗?

接下来,你应该检查第2509行附近的字符。它们是否也是latin-1,或者是从网页或其他地方剪切和粘贴的(也许那里混有UTF-8字符)?

如果您的源文件中的字符与您认为不匹配,那么在进一步操作之前,您可能需要clean up the file

答案 5 :(得分:1)

在代码顶部添加这些行

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

答案 6 :(得分:0)

如果您的文件确实在latin-1中,那么一个简单的解决方法是使用其表示来更改html字符串。

AFAIK:

\x92 => 146 in decimal => Æ => Æ

如果您的角色不是Æ,那么您的文件不会编码为latin-1 ;-)(您可能想检查utf-8 / cp1292是否能更快地获胜)

修改: 当然,您想在尝试之前检查您的ACTUAL文件编码。我可能错了,不是100%肯定\ x92在Iso8859-1中是Æ:根据这个page,它似乎没有定义。