Come creare una stringa unicode con python3


99

Ho usato questo:

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

Ma ottenere un errore con Python 3 (o ... forse ho solo dimenticato di includere qualcosa):

NameError: global name 'unicode' is not defined

Grazie.


17
Se c'è un motivo fantastico per eseguire l'aggiornamento a python 3, è unicode per impostazione predefinita.
JBernardo

Risposte:


137

Le stringhe letterali sono unicode per impostazione predefinita in Python3.

Supponendo che textsia un bytesoggetto, usalo e bastatext.decode('utf-8')

unicodedi Python2 è equivalente a strin Python3, quindi puoi anche scrivere:

str(text, 'utf-8')

se preferisci.


58
TypeError: decoding str non è supportato
Gank

9
@Gank, In Python3 un strè unicode, cioè. è "decodificato", così non ha senso chiamare decodesu di esso
John La Rooy

Same TypeError. Si prega di sostituire con str (txt) o il codice da @magicrebirth di seguito
Simon

3
Il campione originale non è chiaro. Quindi in python3, se vuoi farlo str(text, 'utf-8'), il testo deve essere una stringa binaria. ad esempiostr(b'this is a binary', 'utf-8')
killua8p

10

Cosa c'è di nuovo in Python 3.0 dice:

Tutto il testo è Unicode; tuttavia Unicode codificato è rappresentato come dati binari

Se vuoi assicurarti di emettere utf-8, ecco un esempio da questa pagina su unicode in 3.0 :

b'\x80abc'.decode("utf-8", "strict")

1
questo è esattamente ciò di cui abbiamo bisogno per '\ x80abc'.decode ("utf-8", "strict") in Python 2, grazie
workplaylifecycle

9

Come soluzione alternativa, ho utilizzato questo:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)

12
Perché stai usando una funzione lambda? Questi metodi sono chiamati comunque allo stesso modo. Questa è una variante più semplice: try: unicode = str; except: pass.
Nicolas Bouliane

1
Sembra che tu possa fare solo unicode = strperché non fallirà in 2 o 3
Nickolai

O from six import u as unicodeche preferirei semplicemente perché è più auto-documentante (poiché sei è un livello di compatibilità 2/3) rispetto aunicode = str
Nickolai

3

In questo modo ho risolto il mio problema di convertire caratteri come \ uFE0F, \ u000A, ecc. E anche emoji codificati con 16 byte.

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

In un programma Python 2 che ho usato per molti anni c'era questa riga:

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

Questo non ha funzionato in Python 3.

Tuttavia, il programma si è rivelato funzionare con:

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

Non ricordo perché ho messo unicode lì in primo luogo, ma penso che fosse perché il nome può contenere lettere svedesi åäöÅÄÖ. Ma anche loro funzionano senza "unicode".


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.