在python中处理Utf-8数据

在python中处理Utf-8数据,python,utf-8,ascii,Python,Utf 8,Ascii,我使用python模块请求从一些API获取数据,它们都返回转换为DICT的json数据。我想做的是从这些dict中获取一些信息,或者将它们全部转换为python字符串,在这些字符串中我可以使用词干分析和string.translate()模块,或者将整个内容转换为这些模块可以识别的数据。我不能用UTF-8数据来做这件事,它让我头疼。有什么解决办法吗?我可以迭代dict并将其转换为ASCII吗 奇怪的是,我正在将ASCII字符串与其他函数中的UTF数据进行比较(如果在UTF dict中有ASCII

我使用python模块
请求
从一些API获取数据,它们都返回转换为DICT的json数据。我想做的是从这些dict中获取一些信息,或者将它们全部转换为python字符串,在这些字符串中我可以使用
词干分析
string.translate()
模块,或者将整个内容转换为这些模块可以识别的数据。我不能用UTF-8数据来做这件事,它让我头疼。有什么解决办法吗?我可以迭代dict并将其转换为ASCII吗


奇怪的是,我正在将ASCII字符串与其他函数中的UTF数据进行比较
(如果在UTF dict中有ASCII字:do something)
,它工作得非常好。ASCII值始终与UTF-8数据匹配。我根本无法理解这种编码方式

当您确定该函数不支持Unicode时,您可以始终转换为ASCII近似值:

ascii_string = unicodedata.normalize('NFKD', unicode_string).encode('ascii','ignore') 

UTF-8是ASCII的扩展,因为有效的7位ASCII文本也是有效的UTF-8文本,因此,如果所有数据实际上都可以用ASCII表示,那么无论是ASCII还是UTF-8都没有任何区别

如果数据是UTF-8编码的,最好的方法是将其解码为unicode对象。例如,如果从某个源读入字符串并将其存储在变量
utf8str
中,则可以执行
utf8str.decode('utf-8')
。然后传递此unicode对象,并对该unicode对象执行所有操作。您可以使用
unicode.translate
而不是
string.translate
(假设您在这里引用的是名为“translate”的字符串方法)


如果模块无法处理unicode字符串,则需要考虑如何处理该字符串。如果您的输入包含无法用ASCII表示的字符,您必须决定该怎么办。

这不是一个好主意,因为它只会掩盖错误。如果您有不能用ASCII表示的数据,并且您试图用一个只处理ASCII的函数对其进行操作,那么您就有一个设计问题。仅仅忽略不起作用的字符并不能解决这个问题,而且很可能会导致输出损坏,这将导致以后的麻烦。这可能对我有用,因为我将忽略任何不常用的单词。非ASCII字符被屏蔽/忽略对这个特殊的程序几乎没有影响。但是,例如,在字符串相似的情况下,有些算法很简单,而不是使用Unicode字符串实现,这种转换是适当的,因为某些数据丢失是可以接受的。正如海报所提到的,在他/她的情况下,这可能也是可以接受的。@mhermans只提到父母中的“NFKD”。那是什么?仅仅是一个随机字符串?忽略输入中超出范围的字符也不是一个好主意。如果您的字符串是“the#”,其中#是某个高Unicode字符,那么使用ASCII进行解码并忽略错误将把它读取为“the”,这将被视为一个普通字,即使输入实际上是一些带有奇怪字符的不常见字。我可以放心地说,我的数据在99%的时间内不会包含任何非ASCII字符。如果是这样的话,那就没有什么区别了,因为我正在努力寻找常见的短语,所以它们将被忽略。你说的完全正确,但我接受了默尔曼的答案,因为出于我的需要,这是最简单的解决方案。重做我的代码并研究这些其他方法对于我所需要的东西来说是太多的时间/精力了。谢谢你的意见,不过我一定会继续跟进你所说的内容,以供将来参考,这对我理解
unicode
str
以及它们在Python 2中的工作方式非常有价值。@kojiro非常好的信息,谢谢你