如何使Python解释器正确处理字符串操作中的非ASCII字符?

112 投票
13 回答
226861 浏览
提问于 2025-04-15 13:54

我有一个字符串,看起来是这样的:

6 918 417 712

根据我对Python的理解,处理这个字符串的简单方法是把它放在一个叫做 s 的变量里,然后我们可以这样做:

s.replace('Â ', '')

这样就可以了。但是,它却抱怨说在文件 blabla.py 中有一个非ASCII字符 '\xc2' 没有被编码。

我一直搞不懂怎么在不同的编码之间切换。

这是代码,实际上和上面的一样,只不过现在是在上下文中。这个文件在记事本中保存为UTF-8,并且有以下的头部:

#!/usr/bin/python2.4
# -*- coding: utf-8 -*-

代码如下:

f = urllib.urlopen(url)

soup = BeautifulSoup(f)

s = soup.find('div', {'id':'main_count'})

#making a print 's' here goes well. it shows 6Â 918Â 417Â 712

s.replace('Â ','')

save_main_count(s)

它在 s.replace 这里就停住了……

13 个回答

41
>>> unicode_string = u"hello aåbäcö"
>>> unicode_string.encode("ascii", "ignore")
'hello abc'

当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。

163

去掉所有不能被当作ASCII字符的内容:

def remove_non_ascii(s):
    return "".join(c for c in s if ord(c)<128)

请记住,这个方法在使用UTF-8编码时是一定有效的(因为在多字节字符中,所有字节的最高位都是1)。

87

在Python 2中,源文件默认使用ascii编码,这意味着如果你想在代码中使用非ascii的unicode字符,就必须在文件的顶部指定其他编码。而Python 3则默认使用utf-8编码,所以这个问题就没那么严重了。

你可以查看这个链接了解更多信息: http://docs.python.org/tutorial/interpreter.html#source-code-encoding

要启用utf-8编码,你可以在文件的前两行中加入以下内容:

# -*- coding: utf-8 -*-

上面的内容在文档中有说明,但你也可以这样做:

# coding: utf-8

还有一些额外的注意事项:

  • 源文件在你的文本编辑器中也必须使用正确的编码保存。

  • 在Python 2中,unicode字符串前面必须加一个u,比如s.replace(u"Â ", u"")。而在Python 3中,只需要用引号就可以了。如果在Python 2中你想让它表现得像Python 3,可以使用from __future__ import unicode_literals,但要注意这会影响到整个当前模块。

  • 如果s不是unicode字符串,s.replace(u"Â ", u"")也会失败。

  • string.replace会返回一个新的字符串,而不会直接修改原来的字符串,所以一定要记得使用返回值。

撰写回答