123 votes

Comment faire une chaîne unicode avec python3

J'ai utilisé ce :

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

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

NameError: global name 'unicode' is not defined

Merci.

18 votes

S'il y a une bonne raison de passer à python 3, c'est qu'il est unicode par défaut.

166voto

gnibbler Points 103484

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

En supposant que text est un bytes il suffit d'utiliser text.decode('utf-8')

unicode de Python2 est équivalent à str en Python3, de sorte que vous pouvez également écrire :

str(text, 'utf-8')

si vous préférez.

71 votes

TypeError : le décodage de str n'est pas supporté

13 votes

@Gank, Dans Python3 un str est unicode, c'est-à-dire qu'il est "décodé", ce qui n'a aucun sens d'appeler decode sur elle

1 votes

Même TypeError. Veuillez simplement remplacer par str(txt), ou le code de @magicrebirth ci-dessous

12voto

Tremmors Points 1690

Nouveautés de Python 3.0 dit :

Tous les textes sont en Unicode ; cependant, l'Unicode codé est représenté sous forme de données binaires. données

Si vous voulez vous assurer que la sortie est bien en utf-8, voici un exemple tiré de cette page sur unicode en 3.0 :

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

1 votes

C'est exactement ce dont nous avons besoin pour ' \x80abc '.decode("utf-8", "strict") en Python 2, merci

9voto

magicrebirth Points 731

Comme solution de rechange, j'ai utilisé ceci :

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

12 votes

Pourquoi utilisez-vous une fonction lambda ? Ces méthodes sont appelées de la même manière dans tous les cas. Il s'agit d'une variante plus simple : try: unicode = str; except: pass .

1 votes

Il semble que tu puisses juste faire unicode = str puisqu'il n'échouera ni en 2 ni en 3.

1 votes

Ou from six import u as unicode que je préfère simplement parce qu'il est plus auto-documenté (puisque six est une couche de compatibilité 2/3) que unicode = str

5voto

Ilyas Points 336

C'est ainsi que j'ai résolu mon problème pour convertir des caractères tels que \uFE0F , \u000A etc. Et aussi les emojis qui sont codé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 '

-1voto

Per Persson Points 147

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 en premier lieu, mais je pense que c'était parce que le nom peut contenir les lettres suédoises åäöÅÄÖ. Mais même elles fonctionnent sans "unicode".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X