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.



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.


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

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

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 = "ボールト"

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

10
city = 'Ribeir\xc3\xa3o Preto'
print city.decode('cp1252').encode('utf-8')

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

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')
ñ

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.