Jak utworzyć ciąg znaków Unicode za pomocą python3

100

Użyłem tego:

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

Ale pojawia się błąd w Pythonie 3 (lub ... może po prostu zapomniałem o czymś dołączyć):

NameError: global name 'unicode' is not defined

Dziękuję Ci.

cnd
źródło
17
Jeśli istnieje niesamowity powód, aby przejść na Python 3, domyślnie jest to Unicode.
JBernardo,

Odpowiedzi:

138

W Pythonie3 łańcuchy literalne są domyślnie unicode.

Zakładając, że textjest to bytesprzedmiot, po prostu użyjtext.decode('utf-8')

unicodePython2 jest odpowiednikiem strw Python3, więc możesz również napisać:

str(text, 'utf-8')

Jeśli wolisz.

John La Rooy
źródło
59
TypeError: dekodowanie str nie jest obsługiwane
Gank
9
@Gank, w Pythonie3 a strto unicode, tj. to jest „dekodowane”, więc nie ma sensu, aby zadzwonić decodena nim
John La Rooy
Ten sam TypeError. Proszę po prostu zamienić na str (txt) lub kod z @magicrebirth poniżej
Simon
3
Oryginalna próbka nie jest jasna. Więc w python3, jeśli chcesz to zrobić str(text, 'utf-8'), tekst musi być binarny. np.str(b'this is a binary', 'utf-8')
killua8p
10

Co nowego w Pythonie 3.0 mówi:

Cały tekst jest w formacie Unicode; jednakże zakodowany Unicode jest reprezentowany jako dane binarne

Jeśli chcesz mieć pewność, że generujesz utf-8, oto przykład z tej strony na temat Unicode w wersji 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Drżenie
źródło
1
to jest dokładnie to, czego potrzebujemy do '\ x80abc'.decode ("utf-8", "ścisłe") w Pythonie 2, dzięki
workplaylifecycle
9

Jako obejście używam tego:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)
magiczne odrodzenie
źródło
12
Dlaczego używasz funkcji lambda? W każdym przypadku metody te są nazywane w ten sam sposób. Jest to prostsza odmiana: try: unicode = str; except: pass.
Nicolas Bouliane
1
Wygląda na to, że możesz to zrobić, unicode = strponieważ nie zawiedzie ani w 2, ani w 3
Nickolai
Lub from six import u as unicodektóry wolałbym po prostu dlatego, że jest bardziej unicode = str
samodokumentujący
3

W ten sposób rozwiązałem swój problem z konwersją znaków takich jak \ uFE0F, \ u000A itp. A także emoji, które zakodowały 16 bajtów.

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
źródło
0

W programie w Pythonie 2, z którego korzystałem przez wiele lat, była taka linia:

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

To nie zadziałało w Pythonie 3.

Jednak program okazał się współpracować z:

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

Nie pamiętam, dlaczego umieściłem tam unicode w pierwszej kolejności, ale myślę, że to dlatego, że nazwa może zawierać szwedzkie litery åäöÅĘÖ. Ale nawet one działają bez „unicode”.

Per Persson
źródło
0

najłatwiej w Pythonie 3.x

text = "hi , I'm text"
text.encode('utf-8')
mosi_kha
źródło