ascii-codec kann nicht decodieren byte 0xe3 in der Lage Fehler in Ubuntu/Python, aber nicht auf OS X/Python
Ich bin jetzt auf Ubuntu 13.04 und Python 2.7.4 und versucht, ein Skript auszuführen, einschließlich der folgenden Zeilen:
html = unicode(html, 'cp932').encode('utf-8')
html1, html2 = html.split(some_text) # this line spits out the error
Aber bei mir lief das Skript auf Ubuntu 13.04, aufgespießt auf einen Fehler UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 106: ordinal not in range(128)
. Aber genau das gleiche Skript immer ausgeführt werden können, erfolgreich auf OS X 10.8 und Python-2.7.3. So Frage ich mich, warum der Fehler aufgetreten ist, nur eine der beiden Plattformen...
Der erste Gedanke, der mir in den Sinn gekommen, besonders nach der Lektüre dieses post (UnicodeDecodeError: 'ascii' codec can T decode byte 0xef in position 1) war, dass die Dichotomie entstanden, weil ich bin in einer anderen LANG
Umfeld, wo ich jp_JP.UTF-8
auf OS X aber en_US.UTF-8
auf Ubuntu. Also ich habe auch versucht, fügen Sie eine weitere Zeile os.environ['LANG'] = 'jp_JP.UTF-8'
zu den oben genannten Tasche, aber immer noch den gleichen Fehler.
Einer mehr seltsames Phänomen ist, dass, wenn ich versuche, führen Sie das Skript aus IPython-shell auf Ubuntu und gehen in den debug-Modus sofort, nachdem der Fehler passiert ist, und führen Sie dann die Linie, die ursprünglich der Auslöser für die Fehler, die ich nicht bekomme den Fehler nicht mehr...
Also, was ist hier passiert? Und was bin ich?
Vielen Dank im Voraus.
some_text
? Meine Vermutung ist, dass es ein unicode
Objekt, nicht ein str
. Wenn ja, die Zeile wird wirksam call unicode(html).split(some_text)
, und dass die implizite Konvertierung ist, wo es scheitern wird. Können Sie melden die Art und die bytes auf jeder Plattform und sehen?Auch die Frage, die Sie verlinkt hat nichts zu tun mit dem problem. Als die akzeptierte Antwort, sagt, dass Nutzer das problem nicht über die Codierung und Decodierung in seinem Quelltext, sondern über die implizite Codierung, die geschieht, wenn er
print
s an das terminal. Du bist nicht zu tun, die überall (oder zumindest nicht in dieser Zeile), so hat dies keine Auswirkungen auf Sie. (Und selbst wenn es das täte, beide Orte sind mit UTF-8 sowieso, also wäre das nicht das problem sein.)PS, warum sind Sie mit
unicode(html, 'cp932').encode('utf-8')
? Es ist nicht illegal, mix and match die zwei verschiedenen Möglichkeiten der Umwandlung, aber es ist definitiv seltsam. Warum nicht html.decode('cp932').encode('utf-8')
?
InformationsquelleAutor Blaszard | 2013-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie noch nicht uns genügend Informationen, um sicher zu sein, aber es gibt eine ziemlich gute chance, das ist Ihr problem:
Wenn
some_text
ist einunicode
Objekt, dann ist diese Zeile:... ruft
split
auf einestr
, und übergeben eineunicode
parameter. Wann immer Sie mischenstr
undunicode
im selben Aufruf, Python-2.x Griffen, die automatisch durch den Aufrufunicode
auf diestr
. So, das ist äquivalent zu:... was gleichbedeutend ist mit:
... das wird fehlschlagen, wenn es irgendwelche nicht-ASCII-Zeichen in
html
, genau so, wie Sie sehen.Die einfache Problemumgehung ist, um explizit zu Kodieren
some_text
zu UTF-8:Aber ich persönlich würde nicht einmal versuchen, mit
str
Objekte aus 3 verschiedenen Zeichensätzen alle in das gleiche Programm. Warum nicht einfachdecode
/encode
an den Rändern, und nur umunicode
Objekte überall in-between?html
warstr
undsome_text
warunicode
Objekt. Danach Las ich deinen Kommentar, vor allemsys.getdefaultencoding()
fand ich, dass der Grund dafür, dass OS X und Ubuntu funktioniert etwas anders ist, weil ichsitecustomize.py
auf die ich default encoding auf utf-8 auf OS X, aber nicht unter Ubuntu. Und ich habe die gleiche Datei auch auf Ubuntu, dann wird das Skript erfolgreich ausgeführt wurde. Für Ihre Informationenhtml
wurde produziert von urllib2.urlopen().read(), wusste ich nicht, es gibt einestr
geben. Vielen Dank. Wirklich geschätzt.Die meisten Dinge in Python 2.x-return-ein
str
wenn Sie nicht etwas anderes sagen. Aber selbst im 3.x, wo die meisten Dinge wieder Unicode-Objekteurlopen
noch zurück bytes, weil sonst wäre es zu raten, welche Kodierung. Die Ressourcen, die Sie herunterladen, sind nicht mehr wahrscheinlich, um die Verwendung Ihres Standard-Codierung als alles andere, und in Anbetracht all der Möglichkeiten, die Codierung angegeben werden kann (HTTP-Header, HTML-head-Bereich, überhaupt nicht, ...) gibt es wirklich keine Möglichkeit es erraten kann, so es lässt es bis zu Ihnen.InformationsquelleAutor abarnert