Existe-t-il une fonction de bibliothèque Python qui tente de deviner le codage de caractères de certains octets? [dupliquer]

StackOverflow https://stackoverflow.com/questions/269060

Question

    

Cette question a déjà une réponse ici:

    
            
  •              Comment déterminer le codage du texte?                                      9 réponses                          
  •     
    

J'écris un logiciel de traitement du courrier en Python qui rencontre d'étranges octets dans les champs d'en-tête. Je soupçonne que ce n'est que du courrier malformé; le message lui-même prétend être us-ascii, je ne pense donc pas qu'il existe un véritable encodage, mais j'aimerais obtenir une chaîne unicode proche de l'original sans lancer de UnicodeDecodeError .

Donc, je cherche une fonction qui prend un str et éventuellement quelques astuces et fait son darndest pour me rendre un unicode . Je pourrais bien sûr en écrire un, mais si une telle fonction existe, son auteur a probablement réfléchi un peu plus à la meilleure façon de procéder.

Je sais également que la conception de Python préfère explicite à implicite et que la bibliothèque standard est conçue pour éviter la magie implicite dans le décodage de texte. Je veux simplement dire explicitement "continue et devine".

Était-ce utile?

La solution 3

Autant que je sache, la bibliothèque standard n'a pas de fonction, bien qu'il ne soit pas trop difficile d'en écrire une comme suggéré ci-dessus. Je pense que la vraie chose que je cherchais était un moyen de décoder une chaîne et de garantir qu’elle ne jetterait pas une exception. Le paramètre errors de string.decode fait cela.

def decode(s, encodings=('ascii', 'utf8', 'latin1')):
    for encoding in encodings:
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            pass
    return s.decode('ascii', 'ignore')

Autres conseils

+1 pour le chardet module (suggéré par @insin ).

Il ne figure pas dans la bibliothèque standard, mais vous pouvez facilement l'installer à l'aide de la commande suivante:

$ pip install chardet

Exemple :

>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect('http://stackoverflow.com')
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}    
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib')
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Voir Installer Pip si vous n'en avez pas.

Vous pourriez être intéressé par le détecteur de codage universel .

Le meilleur moyen que j'ai trouvé de faire cela consiste à essayer de manière itérative de décoder une prospective avec chacun des encodages les plus courants à l'intérieur d'un bloc try sauf.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top