Gibt es eine Python-Library-Funktion, die die Zeichencodierung von einigem Bytes zu erraten versucht? [Duplikat]

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

Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Wie die Kodierung des Textes bestimmen?                                      9 Antworten                          
  •     
    

Ich schreibe eine E-Mail-Verarbeitungssoftware in Python, die seltsame Bytes in Header-Felder antrifft. Ich vermute, dass dies nur malformed Mail ist; die Nachricht selbst behauptet, us-ascii zu sein, so dass ich glaube nicht, dass es eine echte Codierung ist, aber ich mag ein Unicode-String Annähern des Original erhalten, ohne einen UnicodeDecodeError zu werfen.

Also, ich bin auf der Suche nach einer Funktion, die ein str nimmt und gegebenenfalls einige Hinweise und macht seinen darndest mir eine unicode zurück zu geben. Ich konnte man natürlich schreiben, aber wenn eine solche Funktion sein Autor existiert gedacht hat wahrscheinlich etwas tiefer über den besten Weg, um dies zu.

Ich weiß auch, dass Python-Design auf implizites explizit bevorzugt, und dass die Standard-Bibliothek ist so konzipiert, implizite Magie in Dekodierung Text zu vermeiden. Ich will nur ausdrücklich sagen: „voran gehen und erraten“.

War es hilfreich?

Lösung 3

Soweit ich sagen kann, ist die Standard-Bibliothek hat keine Funktion, obwohl es nicht zu schwierig ist, einen zu schreiben, wie oben vorgeschlagen. Ich denke, die wirkliche Sache, die ich suchte war ein Weg, um eine Zeichenfolge zu entschlüsseln und zu garantieren, dass es nicht eine Ausnahme auslösen würde. Der Fehler Parameter string.decode tut das.

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

Andere Tipps

1 für die chardet Modul (von @insin ).

Es ist nicht in der Standard-Bibliothek, aber man kann es mit dem folgenden Befehl leicht installieren:

$ pip install chardet

Beispiel :

>>> 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'}

Siehe Installation Pip , wenn Sie noch kein Konto haben.

Sie können daran interessiert sein Universal-Encoding Detector .

Der beste Weg, dies zu tun, die ich gefunden habe, ist iterativ ein prospektive Decodierung zu versuchen, mit jedem der am häufigsten verwendeten Kodierungen innerhalb eines try außer Block.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top