Comment convertir une chaîne en utf-8 en Python

193

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 renvoyé par Python est ASCII. Comment puis-je convertir la chaîne simple en utf-8?

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

Bin Chen
la source
Essayez ce lien http://evanjones.ca/python-utf8.html
Mudassir
Je pense qu'un meilleur titre serait Comment forcer une chaîne à unicode sans traduction?
boatcoder
1
En 2018, python 3 si vous obtenez une erreur de décodage "some_string".encode('utf-8').decode('utf-8')
ASCII

Réponses:

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

^ Conversion en Unicode et spécification de l'encodage.

user225312
la source
34
, UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteJ'obtiens l'erreur suivante: Voici mon code: ret = [] pour la ligne dans csvReader: cline = [] pour l'orme en ligne: unicodestr = unicode (elm, 'utf-8') cline.append (unicodestr) ret .append (cline)
Gopakumar NG
107
Rien de tout cela ne s'applique dans Python 3, toutes les chaînes sont unicode et unicode()n'existent pas.
Noumenon
Un peu cogner ça, mais merci. Cela a résolu un problème où j'essayais d'imprimer unicode et recevais des fichiers.
智障 的 人
Comment vous reconvertir udans un strformat (reconvertir uvers s)?
Tanguy
3
Ce code ne fonctionnera que tant que le texte ne contient pas de caractères non-ascii; un simple caractère accentué sur la chaîne la fera échouer.
Haroldo_OK
71

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

stringnamehere.decode('utf-8', 'ignore')
duhaime
la source
6
Got AttributeError: l'objet 'str' n'a pas d'attribut 'decode'
saran3h
2
@ saran3h on dirait que vous utilisez Python 3, auquel cas Python devrait gérer les problèmes d'encodage pour vous. Avez-vous essayé de lire votre document sans spécifier de codage?
duhaime
Python par défaut choisit l'encodage système. Dans Windows 10, c'est cp1252 qui est différent de utf-8. J'ai perdu quelques heures dessus en utilisant des codecs.open () in py 3.8
Vishesh Mangla
21

Peut-être un peu exagéré, mais lorsque je travaille avec ascii et unicode dans les mêmes fichiers, répéter le décodage peut être pénible, c'est ce que j'utilise:

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input
Blueswannabe
la source
15

Ajout de la ligne suivante en haut de votre fichier .py:

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

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

utfstr = "ボールト"
Ken
la source
1
Ce n'est pas ce que demande OP. Mais évitez de toute façon de tels littéraux de chaîne. Il crée une chaîne Unicode en Python 3 (bon) mais c'est un bytestring en Python 2 (mauvais). Ajoutez from __future__ import unicode_literalsen haut ou utilisez le u''préfixe. N'utilisez pas de caractères non-ascii dans les byteslittéraux. Pour obtenir les octets utf-8, vous pourrez utf8bytes = unicode_text.encode('utf-8')plus tard si nécessaire.
jfs
1
@jfs comment from __future__ import unicode_literalsm'aidera à convertir une chaîne avec des caractères non-ascii en utf-8?
Ortal Turgeman
@OrtalTurgeman Je ne réponds pas à la question. Regardez, c'est un commentaire, pas une réponse. Mon commentaire aborde le problème avec le code dans la réponse. Il essaie de créer une chaîne d'octets avec des caractères non-ascii sur Python 2 (c'est une SyntaxError sur Python 3 - les littéraux d'octets l'interdisent).
jfs
13

Si je vous 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 chaîne unicode est appelée décodage (unicode -> chaîne d'octets est un codage).

Vous faites cela en utilisant la fonction unicode ou la méthode de décodage . Soit:

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

Ou:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")
codeape
la source
10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')
Willem
la source
8

En Python 3.6, ils n'ont pas de méthode unicode () intégrée. Les chaînes sont déjà stockées au format Unicode par défaut et aucune conversion n'est requise. Exemple:

my_str = "\u221a25"
print(my_str)
>>> 25
Productions Zld
la source
3

Traduire avec ord () et unichar (). Chaque caractère unicode a un nombre associé, quelque chose comme un index. Python a donc quelques méthodes pour traduire entre un caractère et son nombre. L'inconvénient est un exemple. J'espère que cela peut vous aider.

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ
Joe9008
la source