Как сделать строку Unicode с помощью python3

101

Я использовал это:

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

Но возникает ошибка с Python 3 (или ... может быть, я просто забыл что-то включить):

NameError: global name 'unicode' is not defined

Спасибо.

cnd
источник
17
Если есть веская причина для обновления до Python 3, по умолчанию используется Unicode.
JBernardo

Ответы:

138

Литеральные строки в Python3 по умолчанию являются юникодом.

Предполагая, что textэто bytesобъект, просто используйтеtext.decode('utf-8')

unicodePython2 эквивалентен strPython3, поэтому вы также можете написать:

str(text, 'utf-8')

Если вы предпочитаете.

Джон Ла Рой
источник
59
TypeError: декодирование str не поддерживается
Gank
9
@Gank, в Python3 a str- это юникод, т.е. он «расшифрован», поэтому нет смысла называть decodeего
Джон Ла Рой
Same TypeError. Просто замените его на str (txt) или код из @magicrebirth ниже
Саймон
3
Исходный образец не ясен. Итак, в python3, если вы хотите str(text, 'utf-8'), текст должен быть двоичной строкой. egstr(b'this is a binary', 'utf-8')
killua8p
10

Что нового в Python 3.0 говорит:

Весь текст в Юникоде; однако закодированный Unicode представлен как двоичные данные

Если вы хотите убедиться, что вы выводите utf-8, вот пример с этой страницы в Unicode в версии 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Тремор
источник
1
это именно то, что нам нужно для '\ x80abc'.decode ("utf-8", "strict") в 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.
Николас Булиан
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]

Я не помню, почему я поставил здесь юникод в первую очередь, но я думаю, что это произошло потому, что имя может содержать шведские буквы åäöÅÄÖ. Но даже они работают без "юникода".

Пер Перссон
источник