解码和unicode之间的区别?

时间:2013-12-18 10:50:43

标签: python python-2.7 unicode

根据这个测试:

# -*- 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

我是对的吗?如果是这样,为什么我们有两种不同的方法来完成同样的事情?我应该使用哪一个?有什么微妙的区别吗?

3 个答案:

答案 0 :(得分:6)

比较两个函数(herehere)的文档,两种方法之间的差异似乎确实非常小。 unicode函数记录为

  

如果给出编码和/或错误,unicode()将解码对象   它可以是8位字符串,也可以是使用的字符缓冲区   用于编码的编解码器。 encoding参数是一个给出名称的字符串   编码;如果编码未知,则引发LookupError。   错误处理是根据错误完成的;这指定了   处理输入编码中无效的字符。如果   错误是'严格'(默认值),错误会引发ValueError,   ...

string.decode状态的描述

  

使用为编码注册的编解码器对字符串进行解码。编码   默认为默认字符串编码。可以给出设置a的错误   不同的错误处理方案。默认为'strict',意思是   编码错误引发UnicodeError。 ...

因此,唯一的区别似乎是unicode也适用于字符缓冲区,并且针对无效输入返回的错误不同(ValueErrorUnicodeError)。另一个细微差别在于向后兼容性: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字符集,则没有功能差异。但是:

  1. u.decode(e)是一种方便的方法,在链式表达式中可能比调用unicode(s,e)稍微更具可读性。

  2. 还有一些字符串转换没有连接到Unicode编码/解码,例如base64string-escape,可以在encode() / decode()中使用但不是unicode()。 (现在通常认为将它们放在与Unicode字符集相同的位置是一个错误;它们在Python 3中被删除,并且可能最终会出现在单独的方法对中。)

  3. unicode()作为构造函数可以使用除str之外的类型,您可能希望为其生成Unicode字符串表示形式。