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