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.


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.


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")

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)

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❤️❤️ '

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".


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.