String.decode() против unicode (строка)

myString = 'éíěřáé'

Мне нужно декодировать эту строку в unicode. Существует ли какая-либо разница между обычными способами и между этими двумя методами в целом?

myString.decode(encoding='UTF-8', errors='ignore')

и

unicode(myString, encoding='UTF-8', errors='ignore')

Ответ 1

Конструктор unicode может использовать другие типы, кроме строк:

>>> unicode(10)
u'10'

Однако для случая байтов две формы в основном эквивалентны. Некоторые параметры кодирования недействительны для конструктора unicode, так как они не приводят к выходу unicode, но действительны для метода tttstring .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() указывает на то, что он действительно декодировал объект и только затем возражал против типа результата.