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.

509voto

fisherman Punkte 10649

Endlich habe ich es geschafft:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# Kodierung=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

Lass mich überprüfen:

as3:~/ngokevin-site# python
Python 2.7.6 (Standard, 6. Dez 2013, 14:49:02)
[GCC 4.4.5] auf linux2
Geben Sie "help", "copyright", "credits" oder "license" für mehr Informationen ein.
>>> import sys
>>> reload(sys)

>>> sys.getdefaultencoding()
'utf8'
>>>

Oben wird die Standardkodierung von Python als utf8 angezeigt. Dann tritt kein Fehler mehr auf.

132voto

GreenAsJade Punkte 14015

Dies ist das klassische "Unicode-Problem". Ich glaube, dass dies über den Rahmen einer StackOverflow-Antwort hinausgeht, um vollständig zu erklären, was passiert.

Es ist gut erklärt hier.

Zusammengefasst haben Sie etwas übergeben, das als eine Bytefolge interpretiert wird, aber es muss in Unicode-Zeichen decodiert werden, und der Standard-Codec (ascii) scheitert.

Die Präsentation, auf die ich Sie hingewiesen habe, gibt Ratschläge, um dies zu vermeiden. Machen Sie Ihren Code zu einem "Unicode-Sandwich". In Python 2 hilft die Verwendung von from __future__ import unicode_literals.

Update: Wie kann der Code repariert werden:

OK - in Ihrer Variable "source" haben Sie einige Bytes. Es ist nicht klar, wie sie dorthin gekommen sind - vielleicht haben Sie sie aus einem Webformular gelesen? In jedem Fall sind sie nicht mit ascii codiert, aber Python versucht, sie in Unicode umzuwandeln und geht davon aus, dass sie es sind. Sie müssen ihm explizit mitteilen, welche Codierung vorliegt. Das bedeutet, dass Sie wissen müssen, welche Codierung es ist! Das ist nicht immer einfach und es hängt ganz davon ab, woher dieser String stammt. Sie könnten mit einigen gängigen Codierungen experimentieren - zum Beispiel UTF-8. Sie geben unicode() die Codierung als zweiten Parameter an:

source = unicode(source, 'utf-8')

45voto

Davy Punkte 483

In einigen Fällen, wenn Sie Ihre Standardcodierung überprüfen (print sys.getdefaultencoding()), wird angezeigt, dass Sie ASCII verwenden. Wenn Sie zu UTF-8 wechseln, funktioniert es nicht, abhängig vom Inhalt Ihrer Variablen. Ich habe einen anderen Weg gefunden:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')

32voto

Zoe L Punkte 999

Ich war auf der Suche, um die folgende Fehlermeldung zu lösen:

unicodedecodeerror: 'ascii' codec kann das Byte 0xe2 in Position 5454 nicht dekodieren: Ordinal nicht im Bereich (128)

Ich habe es schließlich behoben, indem ich 'encoding' angegeben habe:

f = open('../glove/glove.6B.100d.txt', encoding="utf-8")

Ich hoffe, es kann auch dir helfen.

18voto

"UnicodeDecodeError: 'ascii' Codec kann das Byte nicht decodieren"

Ursache dieses Fehlers: input_string muss Unicode sein, aber es wurde str übergeben

"TypeError: Dekodieren von Unicode wird nicht unterstützt"

Ursache dieses Fehlers: Versuch, Unicode input_string in Unicode umzuwandeln


Überprüfen Sie zunächst, ob Ihr input_string str ist, und konvertieren Sie ihn bei Bedarf in Unicode:

if isinstance(input_string, str):
   input_string = unicode(input_string, 'utf-8')

Zweitens ändert das obige Beispiel nur den Typ, entfernt jedoch keine nicht-ASCII-Zeichen. Wenn Sie nicht-ASCII-Zeichen entfernen möchten:

if isinstance(input_string, str):
   input_string = input_string.decode('ascii', 'ignore').encode('ascii') #Hinweis: Dadurch wird das Zeichen entfernt und wieder als Zeichenfolge codiert.

elif isinstance(input_string, unicode):
   input_string = input_string.encode('ascii', 'ignore')

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