将变量类型转换为Unicode字符串

5
我正在寻找一种将变量(可能是ASCII字符串,带有额外字符的Unicode字符串,如é或£,或浮点数或整数)转换为Unicode字符串的方法。
当变量是整数时,variable.encode('utf-8') 会导致 AttributeError: 'int' object has no attribute 'encode'.
当变量是字符串'£'时,str(variable).encode('utf-8') 会导致UnicodeDecodeError:'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
在Python 2.7中有没有简单的方法可以实现我的需求?还是必须检查变量的类型并以不同的方式处理它?
2个回答

4

编码永远不会产生一个unicode对象。你需要从字节串解码成unicode

因此,你需要将其转换为str(一个字节串),然后通过解码转换为unicode

str(obj).decode('utf8')

对于已经是unicode值的对象,这仍然会失败,因此您可能需要使用try..except来捕获这种情况:

try:
    obj = str(obj).decode('utf8')
except UnicodeEncodeError:
    # already unicode
    pass

如果您尝试对一个字节字符串进行编码,Python 2 会隐式地先为您解码为unicode,这就是您遇到UnicodeDecodeError的原因。

将obj转换为str会导致Unicode字符问题,因此您不能仅使用str('一些Unicode字符')。 - Omid S.
1
@OmidS.:这就是为什么有一个try...except语句来捕获这个问题。在Python 2中,对于字节串str('some bytes that encode non-ASCII codepoints')是可以的。对于unicode对象,str(u'unicode string with non-ASCII codepoints')确实会失败,但异常处理程序正是为了处理这种情况而存在的。 - Martijn Pieters

-1

这是一个旧帖子,但我遇到了完全相同的问题 :/ 最终我使用了unicode函数。这是一个内置函数,你可以在这里阅读有关它的信息。

所以唯一的变化是,代替str(theThing) 你可以使用unicode(theThing),如文档中所述,它的行为类似于str,只不过将转换为Unicode字符串而不是ASCII字符串。

只是作为警告,如果你正在使用某种文件写入或其他一些操作,你可能也会遇到问题,或者至少我确实遇到了:D 这篇文章解决了我的问题。


这对于OP提供的确切示例做了错误的事情:一个带有非ASCII字节的字节串,比如 ’£’ - Martijn Pieters
如果您已经有一个Unicode字符串,您必须进行测试;因为这是唯一的例外情况,所以对于其他所有情况,使用str(...).decode(...)更容易。 - Martijn Pieters
嗯,我不太擅长Python编程,但是如果你看一下文档(第一个段落的“here”链接),至少在Python 2.7中确切的功能就是为了这个目的而存在的,文档写得相当清楚。 - Omid S.
当您传递包含非ASCII字节的内容时,会出现问题,这将导致解码失败。 - Martijn Pieters

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