So erstellen Sie eine Unicode-Zeichenfolge mit python3

98

Ich habe das benutzt:

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

Aber es wird ein Fehler mit Python 3 angezeigt (oder ... vielleicht habe ich einfach vergessen, etwas einzuschließen):

NameError: global name 'unicode' is not defined

Danke dir.

cnd
quelle
17
Wenn es einen guten Grund für ein Upgrade auf Python 3 gibt, ist es standardmäßig Unicode.
JBernardo

Antworten:

136

Literalzeichenfolgen sind in Python3 standardmäßig Unicode.

Angenommen, dies textist ein bytesObjekt, verwenden Sie einfachtext.decode('utf-8')

unicodevon Python2 entspricht strPython3, sodass Sie auch schreiben können:

str(text, 'utf-8')

wenn Sie es vorziehen.

John La Rooy
quelle
58
TypeError: Dekodierung str wird nicht unterstützt
Gank
9
@Gank, In Python3 strist a Unicode, dh. es wird „decodiert“ , so macht es keinen Sinn rufen decodeauf sie
John La Rooy
Gleicher TypeError. Bitte ersetzen Sie einfach durch str (txt) oder den Code von @magicrebirth unten
Simon
3
Das Originalmuster ist nicht klar. Wenn Sie dies in Python3 tun möchten, muss str(text, 'utf-8')Text eine binäre Zeichenfolge sein. zBstr(b'this is a binary', 'utf-8')
killua8p
10

Was in Python neu 3.0 sagt:

Der gesamte Text ist Unicode. codierter Unicode wird jedoch als Binärdaten dargestellt

Wenn Sie sicherstellen möchten, dass Sie utf-8 ausgeben, finden Sie hier ein Beispiel auf dieser Seite zu Unicode in 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Tremmors
quelle
1
Dies ist genau das, was wir für '\ x80abc'.decode ("utf-8", "strict") in Python 2
benötigen
9

Um dieses Problem zu umgehen, habe ich Folgendes verwendet:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)
magische Wiedergeburt
quelle
12
Warum verwenden Sie eine Lambda-Funktion? Diese Methoden werden in jedem Fall gleich genannt. Dies ist eine einfachere Variante : try: unicode = str; except: pass.
Nicolas Bouliane
1
Es scheint, als ob Sie es einfach tun können, unicode = strda es weder in 2 noch in 3 scheitern wird
Nickolai
Oder from six import u as unicodewas ich einfach vorziehen würde, weil es unicode = str
selbstdokumentierender
3

Auf diese Weise habe ich mein Problem gelöst, Zeichen wie \ uFE0F, \ u000A usw. zu konvertieren. Und auch Emojis, die mit 16 Bytes codiert sind.

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
quelle
0

In einem Python 2-Programm, das ich viele Jahre lang verwendet habe, gab es diese Zeile:

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

Dies funktionierte in Python 3 nicht.

Es stellte sich jedoch heraus, dass das Programm funktioniert mit:

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

Ich erinnere mich nicht, warum ich dort überhaupt Unicode gesetzt habe, aber ich denke, das lag daran, dass der Name schwedische Buchstaben åäöÅÄÖ enthalten kann. Aber auch sie arbeiten ohne "Unicode".

Per Persson
quelle
0

der einfachste Weg in Python 3.x.

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