如何在Python中解码Unicode字符串

13
什么是解码看起来像这样的编码字符串的最佳方法:u'u\xf1somestring'
背景:我有一个包含随机值(字符串和整数)的列表,我正在尝试将列表中的每个项目转换为字符串,然后处理它们中的每一个。
结果发现其中一些项目的格式为:u'u\xf1somestring'。当我尝试转换为字符串时,会出现错误:UnicodeEncodeError: 'ascii' codec can't encode character u'\xf1' in position 1: ordinal not in range(128) 我已经尝试过:
item = u'u\xf1somestring'
decoded_value = item.decode('utf-8', 'ignore')

然而,我一直遇到相同的错误。

我已经阅读了有关Unicode字符的内容,并尝试了SO上的许多建议,但到目前为止都没有起作用。我是不是漏掉了什么?


如果它是Unicode字符串,那么它已经被解码了。 - RemcoGerlich
你可能会发现这篇文章有帮助:实用的Unicode,它是由Stack Overflow老手Ned Batchelder撰写的。 - PM 2Ring
我假设你正在使用Python 2。你应该始终在Unicode问题中提及Python版本(最好使用适当的标签),因为Python 2和Python 3处理Unicode的方式有所不同。 - PM 2Ring
就这个问题而言,s = u'u\xf1somestring'.encode('utf-8');print s, repr(s) 的输出结果是 uñsomestring 'u\xc3\xb1somestring' - PM 2Ring
2个回答

16
你需要调用encode函数而不是decode函数,因为item已经被解码了。

像这样:

decoded_value = item.encode('utf-8')

1
你需要将编码转换为Unicode,将字节字符串转换为编码。 - Mark Tolonen
@MarkTolonen:那么你在我的回答中哪个部分发现是错误的?我特意使用代码块来表示我在这里讨论的是方法名称。 - Sameer Mirji
1
如果字符串是Unicode字符串,则已经解码。item.encode('utf-8')会生成一个encoded_value。您(以及OP)混淆了术语。 - Mark Tolonen

3

这个字符串已经被解码了(它是一个Unicode对象)。如果你想将它存入文件(或发送到一个普通终端等),你需要对其进行编码

一般来说,当处理Unicode时,在工作流程的早期(在Python 2中)应该将所有的字符串进行解码(你好像已经做到了;许多处理网络流量的库会自动为你完成此操作),然后对Unicode对象进行所有操作,最后,当写回时,将它们编码成你正在使用的任何编码。


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