如何使Python解释器正确处理字符串操作中的非ASCII字符?
我有一个字符串,看起来是这样的:
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 个回答
>>> unicode_string = u"hello aåbäcö"
>>> unicode_string.encode("ascii", "ignore")
'hello abc'
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得更简单易懂。
去掉所有不能被当作ASCII字符的内容:
def remove_non_ascii(s):
return "".join(c for c in s if ord(c)<128)
请记住,这个方法在使用UTF-8编码时是一定有效的(因为在多字节字符中,所有字节的最高位都是1)。
在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
会返回一个新的字符串,而不会直接修改原来的字符串,所以一定要记得使用返回值。