2016-05-17 3 views
0

J'ai un système en python 2.5 qui traite les fichiers dans toutes les langues et l'encodage, je veux enregistrer certaines choses, et je ne suis pas vraiment intéressé par les caractères non standard, je ' Je suis prêt à utiliser uniquement des caractères ascii dans le journal, mais je reçois de temps en temps des erreurs comme.comment ajouter toutes les suites à une chaîne

<type 'tuple'>: (<type 'exceptions.UnicodeEncodeError'>, UnicodeEncodeError('ascii', u'Create project: 2016 May European Tour: There\u2019s Still Time to Buy Tickets!', 45, 46, 'ordinal not in range(128)'), <traceback object at 0x105b84908>) 

Ceci est un exemple du code que j'ai essayé:

ceci fonctionne la plupart du temps, pas toujours

self.__log += data.decode('utf-8', 'ignore').encode("utf-8") 

Cela a échoué, mais il a travaillé sur quelques don précédent 't travail

self.__log += data.encode('ascii', 'ignore') 

Cela a fonctionné pour certains autres cas.

self.__log += data.decode('utf-8', 'replace') 

le journal est en ce moment étant défini comme

self.__log = "" 

Mais j'ai aussi essayé avec

self.__log = u"" 

Le problème est que je ne suis pas en mesure de créer une solution qui fonctionne pour tous les cas, que dois-je faire?

+1

Comme toujours: arrêtez d'utiliser des chaînes d'octets. –

+0

Je n'utilise pas d'octets, ils sont reçus des personnes qui utilisent le service. Je ne peux pas à ce sujet. –

+0

ou est-il un moyen de dépouiller ces caractères? cela fonctionnera pour moi –

Répondre

2

Si vous ne savez pas ce que vous recevez, il n'y a pas de manière agréable et universelle.

Si vous êtes à l'aise avec jeter quoi que ce soit non-ascii, et mutiler des données mal lorsque les données ne sont pas ascii, vous pouvez essayer quelque chose comme ceci:

def forceAscii(s): 
    if isinstance(s, unicode): 
    return unicode(s.encode('ascii', 'replace')) 
    elif isinstance(s, basestring): 
    return s.decode('ascii', 'replace').encode('ascii', 'replace') 
    else: 
    raise ValueError('Expected a string, got a %r' % type(s)) 

Cela vous donnera une chaîne Unicode qui ne contient que des caractères ascii, étant donné une chaîne Unicode ou byte. Les caractères qui ne peuvent pas être convertis en ascii seront remplacés par '?' des notes.

Notez que certains encodages se retrouveront avec quelques caractères mal altérés, par ex. mappé à des caractères ascii non imprimables comme \x00.