【问题标题】:Difference between decode and unicode?解码和unicode的区别?
【发布时间】:2014-01-06 12:14:57
【问题描述】:

根据这个测试:

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

我说的对吗?如果是这样,为什么我们有两种不同的方式来完成同一件事?我应该使用哪一个?有什么细微的差别吗?

【问题讨论】:

    标签: python python-2.7 unicode


    【解决方案1】:

    当您使用的值是 str,并且您使用的编码是 Unicode 字符集时,在功能上没有区别。但是:

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

    2. 1234563 (现在通常认为将它们与 Unicode 字符集放在同一位置是错误的;它们在 Python 3 中已被删除,并且很可能最终会出现在单独的方法对中。)
    3. unicode() 作为构造函数可以采用除 str 之外的类型,您可能希望为其生成 Unicode 字符串表示形式。

    【讨论】:

      【解决方案2】:

      解码:
      使用为编码注册的编解码器对字符串进行解码。 encoding 默认为默认字符串编码。
      http://docs.python.org/2/library/stdtypes.html?#str.decode

      unicode:
      返回对象 [...] 的 Unicode 字符串版本。
      见:http://docs.python.org/2/library/functions.html#unicode

      由于您使用 UTF-8 作为编码,因此函数返回相同。如果您选择其他编码,它们应该返回不同的东西。

      【讨论】:

      • 我说的是解码,不是编码。此外,无论是解码还是 unicode,我都可以显式传递编码参数。那么有什么区别呢?
      • 对,我改成解码了。不过,我试图表达的观点并没有改变。你可以传递一个参数,但你不是必须的。如果您不这样做,函数可能会返回不同的内容,具体取决于您的编码。如果你通过了论点,我猜@jochen 涵盖了细微的差异。
      【解决方案3】:

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

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

      string.decode 状态的描述

      使用为编码注册的编解码器对字符串进行解码。编码 默认为默认字符串编码。可能会给出错误以设置 不同的错误处理方案。默认值为“严格”,这意味着 编码错误引发 UnicodeError。 ...

      因此,唯一的区别似乎是unicode 也适用于字符缓冲区,并且为无效输入返回的错误不同(ValueErrorUnicodeError)。另一个较小的区别在于向后兼容性:unicode 被记录为“2.0 版中的新功能”,而string.decode 是“2.2 版中的新功能”。

      鉴于上述情况,使用哪种方法似乎完全是个人喜好问题。

      【讨论】:

        猜你喜欢
        • 2021-11-27
        • 1970-01-01
        • 2019-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-14
        • 1970-01-01
        相关资源
        最近更新 更多