517 Stimmen

Wie man dieses Problem behebt: "UnicodeDecodeError: 'ascii' codec can't decode byte"

as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
  File "/usr/local/bin/wok", line 4, in
    Engine()
  File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
    self.load_pages()
  File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
    p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
  File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
    page.meta['content'] = page.renderer.render(page.original)
  File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
    return markdown(plain, Markdown.plugins)
  File "/usr/local/lib/python2.7/site-packages/markdown/__init__.py", line 419, in markdown
    return md.convert(text)
  File "/usr/local/lib/python2.7/site-packages/markdown/__init__.py", line 281, in convert
    source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Hinweis: Markdown akzeptiert nur Unicode-Eingaben!

Wie kann man das beheben?

In einigen anderen auf Python basierenden statischen Blog-Apps können chinesische Beiträge erfolgreich veröffentlicht werden. Wie bei dieser App: http://github.com/vrypan/bucket3. Auf meiner Seite http://bc3.brite.biz/ können chinesische Beiträge erfolgreich veröffentlicht werden.

17voto

vervas Punkte 457

Um dies auf einer Betriebssystemebene in einer Ubuntu-Installation zu lösen, überprüfen Sie Folgendes:

$ locale charmap

Wenn Sie erhalten

locale: Kann LC_CTYPE nicht auf Standardlokale setzen: Datei oder Verzeichnis nicht gefunden

anstelle von

UTF-8

dann setzen Sie LC_CTYPE und LC_ALL wie folgt:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"

10voto

Ganesh Shah Punkte 155

Ich hatte den gleichen Fehler und das hat meinen Fehler gelöst. Danke! Python 2 und Python 3 unterscheiden sich im Umgang mit Unicode, was dazu führt, dass gepickelte Dateien ziemlich inkompatibel zum Laden sind. Verwenden Sie also das `encoding`-Argument von Python Pickle. Der unten stehende Link hat mir geholfen, das ähnliche Problem zu lösen, als ich versuchte, gepickelte Daten aus meinem Python 3.7 zu öffnen, während meine Datei ursprünglich in Python 2.x gespeichert wurde. https://blog.modest-destiny.com/posts/python-2-and-3-compatible-pickle-save-and-load/ Ich habe die `load_pickle`-Funktion in mein Skript kopiert und `load_pickle(pickle_file)` aufgerufen, während ich meine `input_data` so geladen habe:

input_data = load_pickle("mein_dataset.pkl")

Die `load_pickle`-Funktion ist hier:

def load_pickle(pickle_file):
    try:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f)
    except UnicodeDecodeError as e:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f, encoding='latin1')
    except Exception as e:
        print('Daten konnten nicht geladen werden ', pickle_file, ':', e)
        raise
    return pickle_data

9voto

miraculixx Punkte 9373

Ich finde es am besten, immer in Unicode umzuwandeln - aber das ist schwer zu erreichen, weil du in der Praxis jeden Argument überprüfen und umwandeln müsstest, den du jemals schreibst, der irgendeine Form der Zeichenverarbeitung enthält.

Also habe ich folgenden Ansatz entwickelt, um entweder Unicodes oder Byte-Strings, aus beliebigen Eingaben, zu garantieren. Kurz gesagt, für die Verwendung der folgenden Lambdas:

# garantieren Unicode-String
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# garantieren Byte-String in UTF8-Kodierung
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)

Beispiele:

text='Einige Zeichenfolge mit Codes > 127, wie Zürich'
utext=u'Einige Zeichenfolge mit Codes > 127, wie Zürich'
print "==> mit _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> mit u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# mit % Formatierung, verwende immer _u() und _uu()
print "Einige unbekannte Eingabe %s" % _u(text)
print "Mehrere Eingaben %s, %s" % _uu(text, text)
# aber mit string.format sicherstellen, immer mit Unicode-Strings zu arbeiten
print u"Funktioniert auch mit Formaten: {}".format(_u(text))
print u"Funktioniert auch mit Formaten: {},{}".format(*_uu(text, text))
# ... oder verwende _u8 und _uu8, weil string.format Byte-Strings erwartet
print "Funktioniert auch mit Formaten: {}".format(_u8(text))
print "Funktioniert auch mit Formaten: {},{}".format(*_uu8(text, text))

Hier ist etwas mehr Überlegung dazu.

7voto

saran3h Punkte 10035

Dies hat für mich funktioniert:

    file = open('docs/my_messy_doc.pdf', 'rb')

7voto

RAFI AFRIDI Punkte 411

Encode konvertiert ein Unicode-Objekt in ein String-Objekt. Ich denke, du versuchst, ein String-Objekt zu encodieren. Konvertiere zuerst dein Ergebnis in ein Unicode-Objekt und encode dann dieses Unicode-Objekt in 'utf-8'. beispielweise

    result = deineFunktion()
    result.decode().encode('utf-8')

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