如何在Python中将字符串(UTF-8或其他)转换为简单的ASCII字符串?

5 投票
5 回答
12488 浏览
提问于 2025-04-15 16:21

在我的Python脚本中,我从一个我没有写的函数那里得到了一个字符串。这个字符串的编码格式不一样。我需要把它转换成ASCII格式。有没有什么简单的方法可以做到这一点?我不介意把那些不是ASCII字符的地方替换成空格或者其他什么东西……

5 个回答

4

我会先把字符串标准化,然后再进行编码。比如说:

import unicodedata
s = u"éèêàùçÇ"
print unicodedata.normalize('NFKD',s).encode('ascii','ignore')

这只有在你输入的是unicode时才有效。 所以,你必须知道这个函数输出的是什么编码,并且要能解码。如果你不知道,可以用一些编码检测的方法,但对于短字符串来说,这些方法并不可靠。

当然,你也可能会运气好,这个函数的输出依赖于各种未知的编码,但如果用ascii作为基础编码,那它们会把0到127的字节分配成相同的值(就像utf-8那样)。

在这种情况下,你可以通过使用OrderedSets来过滤掉不需要的字符:

import string.printable # asccii chars
print "".join(OrderedSet(string.printable) & OrderedSet(s))

或者如果你想用空格代替的话:

print("".join(((char if char in  string.printable else " ") for char in s )))

使用“translate”也可以帮你做到这一点。

知道自己是否运气好唯一的方法就是试试看……有时候,一个大大的幸运日就是每个开发者所需要的 :-)

5

你说“它的编码是不同的”。我猜这里的“它”指的是Python 2.x中的“字符串”,其实就是一串字节。

回答第一部分:如果你不知道这个编码字符串的编码方式,那么,你根本无法对它做任何有意义的操作。如果你知道编码方式,那么第一步就是把你的str转换成unicode

encoded_string = i_have_no_control()
the_encoding = 'utf-8' # for the sake of example
text = unicode(encoded_string, the_encoding)

然后,如果你愿意,可以把你的unicode对象重新编码成ASCII格式。

ascii_garbage = text.encode('ascii', 'replace')

* 虽然有一些方法可以猜测编码,但这些方法比较慢而且不太可靠。这里有一个很不错的Python尝试:chardet

10

如果你想要一个能清楚表示你拥有的内容的ASCII字符串,并且不丢失任何信息,那么答案很简单:

别去搞什么编码或解码,直接使用repr()函数(在Python 2.X中)或者ascii()函数(在Python 3.x中)。

撰写回答