Como fazer string Unicode com python3

99

Eu usei este:

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

Mas recebendo um erro com Python 3 (ou ... talvez eu apenas tenha esquecido de incluir algo):

NameError: global name 'unicode' is not defined

Obrigado.

cnd
fonte
17
Se houver um motivo incrível para atualizar para o python 3, ele é Unicode por padrão.
JBernardo

Respostas:

137

Strings literais são unicode por padrão no Python3.

Supondo que textseja um bytesobjeto, basta usartext.decode('utf-8')

unicodede Python2 é equivalente a strem Python3, então você também pode escrever:

str(text, 'utf-8')

se você preferir.

John La Rooy
fonte
58
TypeError: a decodificação str não é compatível
Gank de
9
@Gank, em Python3 a stré unicode, ou seja, é "decodificado", então não faz sentido chamá decode-lo
John La Rooy,
Mesmo TypeError. Substitua por str (txt) ou o código de @magicrebirth abaixo
Simon
3
A amostra original não é clara. Portanto, em python3, se você quiser fazer str(text, 'utf-8'), o texto deve ser um binário de string. por exemplostr(b'this is a binary', 'utf-8')
killua8p
10

O que há de novo no Python 3.0 diz:

Todo o texto é Unicode; no entanto, o Unicode codificado é representado como dados binários

Se você quiser garantir que está gerando utf-8, aqui está um exemplo desta página em Unicode em 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Tremmors
fonte
1
isso é exatamente o que precisamos para '\ x80abc'.decode ("utf-8", "strict") no Python 2, obrigado
workplaylifecycle
9

Como solução alternativa, tenho usado isto:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)
nascimento mágico
fonte
12
Por que você está usando uma função lambda? Esses métodos são chamados da mesma forma em qualquer caso. Esta é uma variação simples: try: unicode = str; except: pass.
Nicolas Bouliane
1
Parece que você pode simplesmente fazer, unicode = strjá que não vai falhar em 2 ou 3
Nickolai
Ou from six import u as unicodeque eu prefiro simplesmente porque é mais unicode = str
autodocumentado
3

Foi assim que resolvi meu problema de converter chars como \ uFE0F, \ u000A, etc. E também emojis que codificavam com 16 bytes.

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

Em um programa Python 2 que usei por muitos anos, havia esta linha:

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

Isso não funcionou no Python 3.

No entanto, o programa acabou funcionando com:

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

Não me lembro por que coloquei unicode lá em primeiro lugar, mas acho que foi porque o nome pode conter as letras suecas åäöÅÄÖ. Mas mesmo eles funcionam sem "unicode".

Per Persson
fonte
0

a maneira mais fácil em python 3.x

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