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.