108 votes

Comment faire le python interprète gère correctement les caractères non-ASCII dans les opérations de chaîne ?

J'ai une chaîne qui ressemble à ceci:

6 918 417 712

La coupe claire façon de couper cette chaîne (ce que je comprends Python) est simplement de dire que la chaîne est dans une variable nommée s, nous obtenons:

s.replace('Â ', '')

Cela devrait faire l'affaire. Mais bien sûr, il se plaint de ce que le caractère non-ASCII '\xc2' dans le fichier blabla.py n'est pas codé.

Je n'ai jamais vraiment pu comprendre comment basculer entre les différents encodages.

Voici le code, c'est vraiment la même chose que ci-dessus, mais maintenant c'est dans le contexte. Le fichier est enregistré en UTF-8 dans le bloc-notes et a l'en-tête suivant:

#!/usr/bin/python2.4
# -*- coding: utf-8 -*-

Le code:

f = urllib.urlopen(url)

soup = BeautifulSoup(f)

s = soup.find('div', {'id':'main_count'})

#making a print 's' here goes well. it shows 6Â 918Â 417Â 712

s.replace('Â ','')

save_main_count(s)

Il ne reçoit pas plus loin que s.replace...

160voto

fortran Points 26495
<pre><code></code><p>Edit : ma première impulsion est toujours d’utiliser un filtre, mais l’expression de la génératrice est mémoire plus efficace (et plus court)...</p><pre><code></code></pre><p>N’oubliez pas que ceci est garanti pour fonctionner avec le codage UTF-8 (parce que tous les octets dans les caractères multi-octets ont le bit le plus élevé mis à 1).</p></pre>

86voto

Jason S Points 5262

Python 2 utilisations ascii que le codage par défaut pour les fichiers source, ce qui signifie que vous devez spécifier un autre encodage en haut du fichier à utiliser des caractères non ascii des caractères unicode dans les littéraux. Python 3 utilisations utf-8 que le codage par défaut pour les fichiers source, donc c'est moins un problème.

Voir: http://docs.python.org/tutorial/interpreter.html#source-code-encoding

Pour activer utf-8 codage de source, ce serait aller dans l'une des deux premières lignes:

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

Le dessus est dans les docs, mais cela fonctionne aussi:

# coding: utf-8

Autres considérations:

  • Le fichier source doit être enregistré à l'aide de l'encodage correct dans votre éditeur de texte.

  • En Python 2, l'unicode littérale doit avoir un u avant lui, comme en s.replace(u"Â ", u"") Mais en Python 3, il suffit d'utiliser les guillemets. En Python 2, vous pouvez from __future__ import unicode_literals pour obtenir le Python 3 comportement, mais sachez que cela affecte l'ensemble du module en cours.

  • s.replace(u"Â ", u"") sera également échouer si l' s n'est pas une chaîne unicode.

  • string.replace renvoie une nouvelle chaîne et de ne pas modifier, donc assurez-vous d'utiliser la valeur de retour ainsi

39voto

truppo Points 10346
>>> unicode_string = u"hello aåbäcö"
>>> unicode_string.encode("ascii", "ignore")
'hello abc'

16voto

VisioN Points 62518

Le code suivant remplace tous les caractères non ASCII par des points d’interrogation.

6voto

Akoi Meexx Points 370

À l’aide de Regex :

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