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.


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.


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

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)

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❤️❤️ '

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.