Cómo hacer una cadena unicode con python3

99

Usé esto:

u = unicode(text, 'utf-8')

Pero obteniendo un error con Python 3 (o ... tal vez simplemente olvidé incluir algo):

NameError: global name 'unicode' is not defined

Gracias.

cnd
fuente
17
Si hay una razón increíble para actualizar a Python 3, es Unicode por defecto.
JBernardo

Respuestas:

137

Las cadenas literales son Unicode por defecto en Python3.

Suponiendo que textes un bytesobjeto, solo usatext.decode('utf-8')

unicodede Python2 es equivalente a stren Python3, por lo que también puede escribir:

str(text, 'utf-8')

si tu prefieres.

John La Rooy
fuente
58
TypeError: no se admite la decodificación de str
Gank
9
@Gank, en Python3 a stres unicode, es decir. se "decodifica", por lo que no tiene sentido para llamar decodeen él
John La Rooy
Mismo TypeError. Simplemente reemplácelo con str (txt), o el código de @magicrebirth a continuación
Simon
3
La muestra original no está clara. Entonces, en python3, si lo desea str(text, 'utf-8'), el texto debe ser una cadena binaria. por ejemplostr(b'this is a binary', 'utf-8')
killua8p
10

Lo nuevo en Python 3.0 dice:

Todo el texto es Unicode; sin embargo, Unicode codificado se representa como datos binarios

Si desea asegurarse de que está generando utf-8, aquí hay un ejemplo de esta página en unicode en 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Temblores
fuente
1
esto es exactamente lo que necesitamos para '\ x80abc'.decode ("utf-8", "estricto") en Python 2, gracias
workplaylifecycle
9

Como solución alternativa, he estado usando esto:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)
Magia de nacimiento
fuente
12
¿Por qué estás usando una función lambda? Estos métodos se denominan de la misma manera en cualquier caso. Esta es una variación más simple: try: unicode = str; except: pass.
Nicolas Bouliane
1
Parece que puede hacerlo, unicode = strya que no fallará ni en 2 ni en 3
Nickolai
O from six import u as unicodelo que preferiría simplemente porque es más autodocumentado (ya que seis es una capa de compatibilidad de 2/3) queunicode = str
Nickolai
3

Así solucioné mi problema para convertir caracteres como \ uFE0F, \ u000A, etc. Y también emojis que codificaban con 16 bytes.

example = 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\\uD83D\\uDE0D\\uD83D\\uDE0D\\u2764\\uFE0F Present Moment Caf\\u00E8 in St.Augustine\\u2764\\uFE0F\\u2764\\uFE0F '
import codecs
new_str = codecs.unicode_escape_decode(example)[0]
print(new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream\ud83d\ude0d\ud83d\ude0d❤️ Present Moment Cafè in St.Augustine❤️❤️ '
new_new_str = new_str.encode('utf-16', 'surrogatepass').decode('utf-16')
print(new_new_str)
>>> 'raw vegan chocolate cocoa pie w chocolate & vanilla cream😍😍❤️ Present Moment Cafè in St.Augustine❤️❤️ '
Ilyas
fuente
0

En un programa de Python 2 que usé durante muchos años había esta línea:

ocd[i].namn=unicode(a[:b], 'utf-8')

Esto no funcionó en Python 3.

Sin embargo, el programa resultó funcionar con:

ocd[i].namn=a[:b]

No recuerdo por qué puse unicode allí en primer lugar, pero creo que fue porque el nombre puede contener letras suecas åäöÅÄÖ. Pero incluso ellos funcionan sin "unicode".

Per Persson
fuente
0

la forma más fácil en Python 3.x

text = "hi , I'm text"
text.encode('utf-8')
mosi_kha
fuente