2010-07-29 12 views
0

Je travaille avec des données externes codées en latin1. Donc, j'ai ajouter sitecustomize.py et il a ajoutéDéfinir la gestion des erreurs de codage/décodage par défaut implicite dans python

sys.setdefaultencoding('latin_1') 
bien sûr

, travaille maintenant avec des cordes latin1 fonctionne très bien.

Mais, au cas où je rencontre quelque chose qui est pas codé en latin1:

s=str(u'abc\u2013') 

Je reçois UnicodeEncodeError: 'latin-1' codec can't encode character u'\u2013' in position 3: ordinal not in range(256)

Ce que je voudrais est que les caractères indécodables seraient simplement ignorés, à savoir je recevrais que dans l'exemple ci-dessus s=='abc?', et le faire sans appeler explicitement decode() ou encode à chaque fois, c'est-à-dire pas à.d.dode (..., 'remplacer') sur chaque appel.

J'ai essayé de faire des choses différentes avec codecs.register_error mais en vain.

aidez s'il vous plaît?

+1

Si vous faites 's = str (u'abc \ u2013 ')', vous voulez travailler en unicode, ce qui semble bizarre si vous définissez l'encodage par défaut 'latin-1' –

+1

Ceci est une mauvaise idée: http://tarekziade.wordpress.com/2008/01/08/syssetdefaultencoding-is-evil/. Si vous travaillez avec des chaînes codées, vous devez les décoder explicitement. Sinon, vous risquez de couvrir des bogues désagréables. – katrielalex

+1

Plus précisément, vous devriez travailler avec Unicode à l'intérieur de votre module. Décoder les données externes à leur arrivée et les encoder quand elles disparaissent. – katrielalex

Répondre

1

Il existe une raison pour laquelle les scripts ne peuvent pas appeler sys.setdefaultencoding. Ne faites pas cela, certaines bibliothèques (y compris les bibliothèques standard incluses avec Python) s'attendent à ce que la valeur par défaut soit 'ascii'. Au lieu de cela, décoder explicitement les chaînes en Unicode lors de leur lecture dans votre programme (via un fichier, stdin, socket, etc.) et encoder explicitement les chaînes lors de leur écriture.

Le décodage explicite prend un comportement de spécification de paramètre pour les octets non décodables.