Comment créer une chaîne Unicode avec python3

101

J'ai utilisé ceci:

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

Mais obtenir une erreur avec Python 3 (ou ... peut-être que j'ai juste oublié d'inclure quelque chose):

NameError: global name 'unicode' is not defined

Je vous remercie.

cnd
la source
17
S'il y a une bonne raison de mettre à niveau vers python 3, c'est unicode par défaut.
JBernardo

Réponses:

138

Les chaînes littérales sont unicode par défaut dans Python3.

En supposant que textc'est un bytesobjet, utilisez simplementtext.decode('utf-8')

unicodede Python2 est équivalent à stren Python3, vous pouvez donc également écrire:

str(text, 'utf-8')

si tu préfères.

John La Rooy
la source
59
TypeError: le décodage str n'est pas pris en charge
Gank
9
@Gank, En Python3 a strest unicode, c'est-à-dire. il est « décodé » donc il n'a pas de sens d'appeler decodeà ce
John La Rooy
Même typeError. Veuillez simplement le remplacer par str (txt), ou le code de @magicrebirth ci
Simon
3
L'échantillon d'origine n'est pas clair. Donc, en python3, si vous voulez faire str(text, 'utf-8'), le texte doit être une chaîne binaire. egstr(b'this is a binary', 'utf-8')
killua8p
10

Les nouveautés de Python 3.0 indiquent:

Tout le texte est Unicode; cependant Unicode codé est représenté sous forme de données binaires

Si vous voulez vous assurer que vous sortez utf-8, voici un exemple de cette page sur unicode en 3.0 :

b'\x80abc'.decode("utf-8", "strict")
Tremmors
la source
1
c'est exactement ce dont nous avons besoin pour '\ x80abc'.decode ("utf-8", "strict") en Python 2, merci
workplaylifecycle
9

Pour contourner le problème, j'utilise ceci:

# Fix Python 2.x.
try:
    UNICODE_EXISTS = bool(type(unicode))
except NameError:
    unicode = lambda s: str(s)
magie
la source
12
Pourquoi utilisez-vous une fonction lambda? Ces méthodes sont appelées de la même manière dans tous les cas. Ceci est une variante plus simple: try: unicode = str; except: pass.
Nicolas Bouliane
1
Il semble que vous puissiez le faire, unicode = strcar cela n'échouera ni dans 2 ni dans 3
Nickolai
Ou from six import u as unicodeque je préférerais simplement parce que c'est plus auto-documenté (puisque six est une couche de compatibilité 2/3) queunicode = str
Nickolai
3

C'est ainsi que j'ai résolu mon problème pour convertir des caractères comme \ uFE0F, \ u000A, etc. Et aussi des emojis encodés avec 16 octets.

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
la source
0

Dans un programme Python 2 que j'ai utilisé pendant de nombreuses années, il y avait cette ligne:

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

Cela ne fonctionnait pas dans Python 3.

Cependant, le programme s'est avéré fonctionner avec:

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

Je ne me souviens pas pourquoi j'ai mis unicode là en premier lieu, mais je pense que c'était parce que le nom peut contenir des lettres suédoises åäöÅÄÖ. Mais même ils fonctionnent sans "unicode".

Par Persson
la source
0

le moyen le plus simple en python 3.x

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