Як зробити рядок Unicode з python3


99

Я використав це:

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

Але помилка з Python 3 (або ... можливо я просто забув щось включити):

NameError: global name 'unicode' is not defined

Дякую.


17
Якщо є дивовижна причина для оновлення до python 3, він є unicode за замовчуванням.
JBernardo

Відповіді:


137

Літеральні рядки за замовчуванням є унікодом у Python3.

Припускаючи, що textце bytesоб’єкт, просто використовуйтеtext.decode('utf-8')

unicodePython2 еквівалентний strPython3, тому ви також можете написати:

str(text, 'utf-8')

якщо ви віддаєте перевагу.


58
TypeError: декодування str не підтримується
Gank

9
@Gank, У Python3 a strє unicode, тобто. це "розшифровано", тому немає сенсу дзвонити decodeна нього
Джон Ла Руй,

Той самий типError. Будь ласка, просто замініть str (txt) або код від @magicrebirth нижче
Simon

3
Оригінальний зразок не зрозумілий. Отже, у python3, якщо ви хочете це зробити str(text, 'utf-8'), текст повинен бути двійковим рядком. наприкладstr(b'this is a binary', 'utf-8')
killua8p

10

Що нового в Python 3.0 говорить:

Весь текст Unicode; однак кодований Unicode представлений у вигляді двійкових даних

Якщо ви хочете переконатися, що ви виводите utf-8, ось приклад з цієї сторінки на unicode в 3.0 :

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

1
це саме те, що нам потрібно для '\ x80abc'.decode ("utf-8", "строгий") в Python 2, спасибі
workplaylifecycle

9

Як вирішення, я використовував це:

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

12
Чому ви використовуєте функцію лямбда? Ці методи називаються однаково в будь-якому випадку. Це більш простий варіант: try: unicode = str; except: pass.
Nicolas Bouliane

1
Здається, ви можете просто зробити, unicode = strоскільки це не вийде ні з 2, ні з 3
Миколай

Або from six import u as unicodeщо я вважаю за краще просто тому, що це більше самодокументування (оскільки шість є шаром сумісності 2/3), ніжunicode = str
Миколай

3

Так я вирішив свою проблему з перетворенням символів на зразок \ uFE0F, \ u000A тощо. А також емоджи, кодовані 16 байтами.

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

У програмі Python 2, якою я користувався багато років, був такий рядок:

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

Це не спрацювало в Python 3.

Однак програма виявилася співпрацею з:

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

Я не пам'ятаю, чому я поставив там унікод в першу чергу, але я думаю, що це було тому, що назва може містити шведські літери åäöÅÄÖ. Але навіть вони працюють без "унікоду".


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.