在python中将字符串(utf-8或其他)转换为简单的ASCII字符串的简单方法是什么

2024-05-20 22:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在python脚本中,我从一个没有编写的函数中得到一些字符串。它的编码是不同的。我需要把它转换成ascii格式。做这件事有什么愚蠢的方法吗?我不介意把非ascii字符替换为空白或其他内容。。。


Tags: 方法函数字符串脚本内容编码格式ascii
3条回答

你说“它的编码不同”。我猜“it”是指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')

*猜测编码有启发式方法,但它们速度慢且不可靠。这是one excellent attempt in Python

我试着将字符串规范化,然后对其进行编码。怎么办:

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 )))

“翻译”可以帮助你做同样的事情。

唯一能知道你有没有这么幸运的方法就是试试。。。有时,任何开发人员都需要一个巨大的幸运日:-)

如果您想要一个明确表示您所得到的信息的ASCII字符串,而不丢失任何信息,答案很简单:

不要乱用encode/decode,使用repr()函数(Python 2.X)或ascii()函数(Python 3.X)。

相关问题 更多 >