web-dev-qa-db-fra.com

Convertir une chaîne Unicode en chaîne dans Python (contenant des symboles supplémentaires)

Comment convertir une chaîne Unicode (contenant des caractères supplémentaires tels que £ $, etc.) en chaîne Python?

476
williamtroup
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
545
Sorantis

Vous pouvez utiliser encoder to ASCII si vous n'avez pas besoin de traduire les caractères non-ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
310
Ferran
>>> text=u'abcd'
>>> str(text)
'abcd'

Si la chaîne ne contient que des caractères ascii.

127
igco

Si vous avez une chaîne Unicode et que vous souhaitez l'écrire dans un fichier ou un autre formulaire sérialisé, vous devez d'abord l'encoder dans une représentation particulière: peut être stocké. Il existe plusieurs codages Unicode courants, tels que UTF-16 (utilise deux octets pour la plupart des caractères Unicode) ou UTF-8 (1-4 octets/codepoint selon le caractère), etc. Pour convertir cette chaîne en un codage particulier, vous devez peut utiliser:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

Cette chaîne d'octets brute peut être écrite dans un fichier. Cependant, notez que lors de la lecture, vous devez savoir dans quel encodage il se trouve et le décoder à l'aide du même encodage.

Lors de l'écriture dans des fichiers, vous pouvez vous débarrasser de ce processus de codage/décodage manuel en utilisant le module codecs . Donc, pour ouvrir un fichier qui code toutes les chaînes Unicode en TF-8 , utilisez:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

Notez que tout ce qui utilise ces fichiers doit comprendre le codage du fichier s'il veut les lire. Si vous êtes le seul à lire/écrire, ce n’est pas un problème, sinon, assurez-vous d’écrire sous une forme compréhensible pour tout le monde qui utilise les fichiers.

Dans Python 3, cette forme d'accès aux fichiers est la valeur par défaut et la fonction intégrée open prend un paramètre de codage et est toujours traduite en/à partir de chaînes Unicode (l'objet chaîne par défaut dans Python 3) pour les fichiers ouverts en mode texte.

112
Brian

Voici un exemple:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
56
Bastien Léonard

Eh bien, si vous êtes prêt/prêt à passer à Python 3 (ce qui n'est peut-être pas dû à l'incompatibilité avec le code Python 2 précédent), vous n'avez pas à faire n'importe quelle conversion; tout le texte dans Python 3 est représenté par des chaînes Unicode, ce qui signifie également qu'il n'y a plus d'usage de la syntaxe u'<text>'. Vous avez également ce qui sont en fait des chaînes d'octets, qui servent à représenter des données (qui peuvent être une chaîne codée).

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(Bien sûr, si vous utilisez actuellement Python 3, le problème est probablement lié à la façon dont vous essayez d'enregistrer le texte dans un fichier.)

5
JAB

Voici un exemple de code

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
4
Gihan Chathuranga