2012-08-08 20 views
11
myString = 'éíěřáé' 

necesito para decodificar esta cadena a Unicode. ¿Hay alguna diferencia entre seguir usos y entre estos dos métodos en general?string.decode() vs. Unicode (cadena)

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

y

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

Respuesta

9

El unicode constructor puede tomar otros tipos aparte de cadenas:

>>> unicode(10) 
u'10' 

Para el caso cadena de bytes, sin embargo, las dos formas son en su mayoría equivalente. Algunas opciones de codificación no son válidos para el constructor unicode ya que no dan lugar a la producción de Unicode, pero son válidas para el método de cadenas de bytes .decode, como '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) 
0

En Python 2.x str.decode() puede dar lugar a cualquiera un objeto Unicode u otro str. La función unicode() solo funciona para las codificaciones que dan como resultado un objeto Unicode.

Por ejemplo:

>>> "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) 
>>> 

Tenga en cuenta que internamente ambos trabajan de la misma manera que el llamado a unicode() está indicando que tenía realmente decodificar el objeto y sólo entonces se opusieron al tipo del resultado.

2

Son esencialmente lo mismo, pero con algunos accesos directos de rendimiento menores en cualquier caso; str.decode sabe que su argumento es una cadena, por lo que puede atacar la verificación de tipo de su argumento, mientras que unicode.__new__ tiene accesos directos para algunas codificaciones comunes, incluyendo UTF-8.

Ambos métodos llaman a PyCodec_Decode en el caso general.