【问题标题】:string.decode() vs. unicode(string)string.decode() 与 unicode(string)
【发布时间】:2012-08-05 09:18:38
【问题描述】:
myString = 'éíěřáé'
我需要将此字符串解码为 unicode。
下面的用法和这两种方法之间有什么区别吗?
myString.decode(encoding='UTF-8', errors='ignore')
和
unicode(myString, encoding='UTF-8', errors='ignore')
【问题讨论】:
标签:
python
string
unicode
decode
【解决方案1】:
unicode 构造函数可以接受除字符串之外的其他类型:
>>> unicode(10)
u'10'
然而,对于字节串的情况,这两种形式大多是等价的。某些编码选项对unicode构造函数无效,因为它们不会产生unicode输出,但对字节串的.decode方法有效,例如'hex':
>>> unicode('10', encoding='hex')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: decoder did not return an unicode object (type=str)
【解决方案2】:
它们本质上是相同的,但在任何一种情况下都有一些小的性能捷径; str.decode 知道它的参数是一个字符串,所以它可以快捷地检查它的参数,而 unicode.__new__ 有一些常用编码的快捷方式,包括 UTF-8。
在一般情况下,这两种方法都调用PyCodec_Decode。
【解决方案3】:
在 Python 2.x 中,str.decode() 可能会产生一个 unicode 对象或另一个 str。 unicode() 函数仅适用于产生 unicode 对象的编码。
例如:
>>> "x\x9cKLJ\x06\x00\x02M\x01'".decode('zip')
'abc'
>>> unicode("x\x9cKLJ\x06\x00\x02M\x01'", encoding='zip')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: decoder did not return an unicode object (type=str)
>>>
请注意,它们在内部的工作方式与对 unicode() 的调用非常相似,这表明它确实解码了对象,然后才反对结果的类型。