根据这个测试:
# -*- coding: utf-8 -*-
ENCODING = 'utf-8'
# what is the difference between decode and unicode?
test_cases = [
'aaaaa',
'ááááá',
'ℕℤℚℝℂ',
]
FORMAT = '%-10s %5d %-10s %-10s %5d %-10s %10s'
for text in test_cases :
decoded = text.decode(ENCODING)
unicoded = unicode(text, ENCODING)
equal = decoded == unicoded
print FORMAT % (decoded, len(decoded), type(decoded), unicoded, len(unicoded), type(unicoded), equal)
.decode()
和unicode()
之间没有区别:
aaaaa 5 <type 'unicode'> aaaaa 5 <type 'unicode'> True
ááááá 5 <type 'unicode'> ááááá 5 <type 'unicode'> True
ℕℤℚℝℂ 5 <type 'unicode'> ℕℤℚℝℂ 5 <type 'unicode'> True
我是对的吗?如果是这样,为什么我们有两种不同的方法来完成同样的事情?我应该使用哪一个?有什么微妙的区别吗?
答案 0 :(得分:6)
比较两个函数(here和here)的文档,两种方法之间的差异似乎确实非常小。 unicode
函数记录为
如果给出编码和/或错误,unicode()将解码对象 它可以是8位字符串,也可以是使用的字符缓冲区 用于编码的编解码器。 encoding参数是一个给出名称的字符串 编码;如果编码未知,则引发LookupError。 错误处理是根据错误完成的;这指定了 处理输入编码中无效的字符。如果 错误是'严格'(默认值),错误会引发ValueError, ...
而string.decode
状态的描述
使用为编码注册的编解码器对字符串进行解码。编码 默认为默认字符串编码。可以给出设置a的错误 不同的错误处理方案。默认为'strict',意思是 编码错误引发UnicodeError。 ...
因此,唯一的区别似乎是unicode
也适用于字符缓冲区,并且针对无效输入返回的错误不同(ValueError
与UnicodeError
)。另一个细微差别在于向后兼容性:unicode
被记录为“2.0版本中的新功能”,而string.decode
是“版本2.2中的新功能”。
鉴于上述情况,使用哪种方法似乎完全是品味问题。
答案 1 :(得分:3)
解码:
使用为编码注册的编解码器对字符串进行解码。 encoding默认为默认字符串编码
http://docs.python.org/2/library/stdtypes.html?#str.decode
的unicode:
返回对象[...]的Unicode字符串版本
请参阅:http://docs.python.org/2/library/functions.html#unicode
由于您使用UTF-8作为编码,因此函数返回相同的值。如果您选择其他编码,则应返回不同的内容。
答案 2 :(得分:0)
如果您使用的值是str
,并且您使用的编码是Unicode字符集,则没有功能差异。但是:
u.decode(e)
是一种方便的方法,在链式表达式中可能比调用unicode(s,e)
稍微更具可读性。
还有一些字符串转换没有连接到Unicode编码/解码,例如base64
或string-escape
,可以在encode()
/ decode()
中使用但不是unicode()
。 (现在通常认为将它们放在与Unicode字符集相同的位置是一个错误;它们在Python 3中被删除,并且可能最终会出现在单独的方法对中。)
unicode()
作为构造函数可以使用除str
之外的类型,您可能希望为其生成Unicode字符串表示形式。