>>> 'Tannh‰user'.encode().decode('ascii', 'replace').replace(u'\ufffd', '_')
'Tannh___user'
首先,我们使用创建字节字符串encode()
-默认情况下,它使用UTF-8编解码器。如果您有字节字符串,那么当然可以跳过此编码步骤。然后,我们使用ascii编解码器将其转换为“普通”字符串。
这使用了UTF-8的属性,即所有非ASCII字符都被编码为值> = 0x80的字节序列。
如何使用内置str.decode
方法做到这一点:
>>> 'Tannh‰user'.decode('ascii', 'replace').replace(u'\ufffd', '_')
u'Tannh___user'
(您会得到unicode
字符串,因此可以str
根据需要将其转换为。)
您还可以转换unicode
为str
,因此一个非ASCII字符将被ASCII之一代替。但是问题在于,unicode.encode
通过replace
将非ASCII字符转换为'?'
,所以您不知道问号是否已经存在;请参阅Ignacio Vazquez-Abrams的解决方案。
另一种方法是使用ord()
和比较每个字符的值(如果它们适合ASCII范围(0-127))-这适用于unicode
字符串以及str
utf-8,拉丁语和其他一些编码:
>>> s = 'Tannh‰user' # or u'Tannh‰user' in Python 2
>>>
>>> ''.join(c if ord(c) < 128 else '_' for c in s)
'Tannh_user'