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.


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.


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

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)

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

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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.