238 votes

Comment convertir une chaîne de caractères en utf-8 en Python

J'ai un navigateur qui envoie des caractères utf-8 à mon serveur Python, mais lorsque je le récupère à partir de la chaîne de requête, l'encodage que Python renvoie est ASCII. Comment puis-je convertir la chaîne en clair en utf-8 ?

NOTE : La chaîne passée depuis le web est déjà encodée en UTF-8, je veux juste que Python la traite comme UTF-8 et non ASCII.

1 votes

0 votes

Je pense qu'un meilleur titre serait Comment convertir une chaîne en unicode sans traduction ?

3 votes

En 2018, python 3 si vous obtenez l'erreur de décodage ascii faire "some_string".encode('utf-8').decode('utf-8')

309voto

user225312 Points 22699

En Python 2

>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^ C'est la différence entre une chaîne d'octets (plain_string) et une chaîne unicode.

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^ Convertir en unicode et spécifier l'encodage.

En Python 3

Toutes les chaînes de caractères sont unicode. Le site unicode n'existe plus. Voir la réponse de @Noumenon

37 votes

J'obtiens l'erreur suivante : UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byte Voici mon code : ret=[] for line in csvReader : cline=[] for elm in line : unicodestr = unicode(elm, 'utf-8') cline.append(unicodestr) ret.append(cline)

131 votes

Rien de tout cela ne s'applique en Python 3, toutes les chaînes de caractères sont unicode et unicode() n'existe pas.

0 votes

C'est un peu comme si c'était hier, mais merci. Cela a corrigé un problème où j'essayais d'imprimer l'unicode et j'obtenais des s.

83voto

duhaime Points 494

Si les méthodes ci-dessus ne fonctionnent pas, vous pouvez également indiquer à Python d'ignorer les parties d'une chaîne qu'il ne peut pas convertir en utf-8 :

stringnamehere.decode('utf-8', 'ignore')

32 votes

Got AttributeError : L'objet 'str' n'a pas d'attribut 'decode'.

3 votes

@saran3h il semble que vous utilisiez Python 3, dans ce cas Python debe gère les problèmes d'encodage pour vous. Avez-vous essayé de lire votre document sans spécifier d'encodage ?

3 votes

Par défaut, Python choisit l'encodage du système. Sous Windows 10, c'est cp1252, ce qui est différent de utf-8. J'ai perdu quelques heures sur ce problème en utilisant codecs.open() dans py 3.8.

24voto

Blueswannabe Points 241

C'est peut-être un peu exagéré, mais lorsque je travaille avec de l'ascii et de l'unicode dans les mêmes fichiers, le décodage répété peut être une douleur, c'est ce que j'utilise :

def make_unicode(inp):
    if type(inp) != unicode:
        inp =  inp.decode('utf-8')
    return inp

2 votes

Cela ne fonctionne plus, tel qu'il est écrit... la unicode le type n'existe pas dans python3

16voto

Ken Points 51

Ajoutez la ligne suivante au début de votre fichier .py :

# -*- coding: utf-8 -*-

vous permet d'encoder des chaînes de caractères directement dans votre script, comme ceci :

utfstr = "ボールト"

2 votes

Ce n'est pas ce que demande le PO. Mais évitez de telles chaînes de caractères de toute façon. Cela crée une chaîne Unicode en Python 3 (bien) mais c'est un bytestring en Python 2 (mal). Soit vous ajoutez from __future__ import unicode_literals en haut de la page ou utilisez u'' préfixe. N'utilisez pas de caractères non ascii dans les éléments suivants bytes littéraux. Pour obtenir des octets utf-8, vous pourriez utf8bytes = unicode_text.encode('utf-8') plus tard si cela s'avère nécessaire.

1 votes

@jfs comment from __future__ import unicode_literals aidez-moi à convertir une chaîne de caractères non ascii en utf-8 ?

0 votes

@OrtalTurgeman Je ne réponds pas à la question. Regardez, c'est un commentaire, pas une réponse. Mon commentaire traite du problème avec le code dans la réponse. Il essaie de créer un bytestring avec des caractères non ascii sur Python 2 (c'est une SyntaxError sur Python 3 - les bytes literals l'interdisent).

13voto

codeape Points 38576

Si je comprends bien, vous avez une chaîne d'octets encodée en utf-8 dans votre code.

La conversion d'une chaîne d'octets en une chaîne unicode est appelée décodage (unicode -> chaîne d'octets est un encodage).

Pour ce faire, vous utilisez l'option unicode ou la fonction décoder méthode. Soit :

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

Ou :

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")

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