6 Stimmen

Wie dekodiere ich ein Nicht-Unicode-Zeichen in Python?

Ich habe eine Zeichenfolge, die besagt s = 'Chocolate Moelleux-M\xe8re' Wenn ich etwas tue:

In [14]: unicode(s)
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 20: ordinal not in range(128)

Ähnlich verhält es sich, wenn ich versuche, dies zu entschlüsseln, indem ich s.decode() wird derselbe Fehler zurückgegeben.

In [13]: s.decode()
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 20: ordinal not in range(128)

Wie dekodiert man eine solche Zeichenkette in Unicode?

11voto

Srikar Appalaraju Punkte 68866

Mit diesem Problem bin ich schon zu oft konfrontiert worden. Das Problem, das ich hatte, enthielt Zeichenketten in verschiedenen Kodierungsschemata. Also schrieb ich eine Methode zur heuristischen Dekodierung einer Zeichenkette auf der Grundlage bestimmter Merkmale der verschiedenen Kodierungen.

def decode_heuristically(string, enc = None, denc = sys.getdefaultencoding()):
    """
    Try to interpret 'string' using several possible encodings.
    @input : string, encode type.
    @output: a list [decoded_string, flag_decoded, encoding]
    """
    if isinstance(string, unicode): return string, 0, "utf-8"
    try:
        new_string = unicode(string, "ascii")
        return string, 0, "ascii"
    except UnicodeError:
        encodings = ["utf-8","iso-8859-1","cp1252","iso-8859-15"]

        if denc != "ascii": encodings.insert(0, denc)

        if enc: encodings.insert(0, enc)

        for enc in encodings:
            if (enc in ("iso-8859-15", "iso-8859-1") and
                re.search(r"[\x80-\x9f]", string) is not None):
                continue

            if (enc in ("iso-8859-1", "cp1252") and
                re.search(r"[\xa4\xa6\xa8\xb4\xb8\xbc-\xbe]", string)\
                is not None):
                continue

            try:
                new_string = unicode(string, enc)
            except UnicodeError:
                pass
            else:
                if new_string.encode(enc) == string:
                    return new_string, 0, enc

        # If unable to decode,doing force decoding i.e.neglecting those chars.
        output = [(unicode(string, enc, "ignore"), enc) for enc in encodings]
        output = [(len(new_string[0]), new_string) for new_string in output]
        output.sort()
        new_string, enc = output[-1][1]
        return new_string, 1, enc

Darüber hinaus gibt dieser Link ein gutes Feedback darüber, warum Kodierung usw. - Warum wir sys.setdefaultencoging im py-Skript brauchen

4voto

Habbie Punkte 2010

Sie müssen s.decode Ihre Kodierung mitteilen. In Ihrem Fall s.decode('latin-1') scheint passend.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X