将未知字符转换为ASCII的Python方法

4

我正在处理一个文本文件,里面有像����这样的字符。不确定它们是什么。

我想知道如何去除/转换这些字符。

我尝试使用.encode('ascii', 'ignore')将其转换为ascii。但是Python提示char不在0-128之间。

我还尝试过unicodedata.normalize('NFKD', text).encode('ascii', 'ignore'),但是出现了相同的错误。

有人能帮忙吗?

谢谢!


od -x 报告 bfef efbd bdbf bfef efbd bdbf - sarnold
2个回答

8
您可以始终使用Unicode字符串并使用您展示的代码:
my_ascii = my_uni_string.encode('ascii', 'ignore')

如果您收到了错误提示,则最初没有真正的Unicode字符串。 如果是这样,您将拥有一个字节字符串。 您需要知道它使用的编码方式,并使用以下方法将其转换为Unicode字符串:

my_uni_string = my_byte_string.decode('utf8')

假设您的编码方式是UTF-8。

字节字符串和Unicode字符串之间的区别可能会让人感到困惑。我的演示文稿“实用的Unicode,或者说,如何停止痛苦”可以帮助您搞清楚所有这些。


谢谢您的演示。但是我该如何找出原始文本的编码方式? - cheng
@cheng 我不确定你是否可以轻易地直觉出一个随机字符串的编码方式。但它可能在文件或其他地方显示给你了。 - TankorSmash
正如演示中所解释的那样,您必须通过一些先前的协议来了解编码。您可以猜测编码,但确定编码的唯一方法是拥有解释编码的规范。 - Ned Batchelder

1

这并不完美(尤其是对于短字符串),但chardet库在这里可能会有用:

http://pypi.python.org/pypi/chardet

要让chardet找出编码,然后将其编码为unicode,您可以执行以下操作:
import chardet
encoding = chardet.detect(some_string)['encoding']
unicode_string = unicode(some_string, encoding)

当然,如果它们超出了ASCII范围,您将无法将它们编码为ASCII。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接